协程
协程是golang最重要的一个特性。在协程出现之前,线程被作为调度的最小单位。协程可以理解是一种用户态,逻辑层面的线程。 通过协程,我们将很容易地实现高并发。 加入你要做三件事,假设要执行a,b,c三个方法。代码该怎么写?平常我们的写法就是
a() b() c() 复制代码
只有a做完了,才能做b,b做完了,才能做c。 但有了协程就可以
go a() go b() go c() 复制代码
三个同时进行,充分利用多核的性能。
管道
管道概念
- 类似unix中管道(pipe)
- 先进先出
- 线程安全,多个goroutine同时访问,不需要加锁
- channel是有类型的,一个整数的channel只能存放整数
管道的定义
var ch0 chan int var ch1 chan string var ch2 chan map[string]string type stu struct{} var ch3 chan stu var ch4 chan *stu 复制代码
管道用于协程之间数据的传递。一般分为有缓冲管道,和无缓冲管道。两个协程间如果有数据交流怎么办,这时候就可以用管道来传递。 golang的设计是想就是用通信代替共享内存。
func a() { ch <- 1 } func b() { ch <- } 复制代码
管道可以带缓冲,就是说可以往管道里放多个数据,放满了,才会阻塞。
c1:=make(chan int) 无缓冲 c2:=make(chan int,1) 有缓冲 复制代码
c1<-1 无缓冲: 不仅仅是向 c1 通道放 1,而是一直要等有别的携程 <-c1 接手了这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着。
有缓冲: c2<-1 则不会阻塞,因为缓冲大小是1,只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。
面试经常会问到这个问题。 实际就是同步和异步的区别。
接口 interface
定义:An interface is a collection of method signatures that an Object can implement 一个接口是一组函数签名的集合。具体结构可以实现他们。 比如:
type Shape interface { Area() float64 Perimeter() float64 } 复制代码
这就是一个接口,声明了两个方法Area和Perimeter 下面咱们可以定义具体结构,实现这个接口。
// type rect type Rect struct { height float64 weight float64 } func (p *Rect) Area() float64 { return p.height * p.weight } func (p *Rect) Perimeter() float64 { return 2 * (p.height + p.weight) } 复制代码
接口可以提供面向对象编程的能力,只要实现了某接口,就可以用该接口对象 指向具体类型对象。相同类型的引用,指向不同对象,即多态。 我们看到,golang中的派生关系,不像c++,java一样需要显式指定,只需要实现接口所定义的所有方法即可。所以,golang的继承关系,是非侵入式的,这也是golang的特色与优点。
有疑问加站长微信联系(非本文作者)