协程是golang最重要的一个特性。在协程出现以前,线程被做为调度的最小单位。协程能够理解是一种用户态,逻辑层面的线程。 经过协程,咱们将很容易地实现高并发。 加入你要作三件事,假设要执行a,b,c三个方法。代码该怎么写?日常咱们的写法就是java
a()
b()
c()
复制代码
只有a作完了,才能作b,b作完了,才能作c。 但有了协程就能够c++
go a()
go b()
go c()
复制代码
三个同时进行,充分利用多核的性能。golang
管道概念面试
管道的定义编程
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 <-
}
复制代码
管道能够带缓冲,就是说能够往管道里放多个数据,放满了,才会阻塞。bash
c1:=make(chan int) 无缓冲
c2:=make(chan int,1) 有缓冲
复制代码
c1<-1 无缓冲: 不单单是向 c1 通道放 1,而是一直要等有别的携程 <-c1 接手了这个参数,那么c1<-1才会继续下去,要否则就一直阻塞着。并发
有缓冲: c2<-1 则不会阻塞,由于缓冲大小是1,只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。异步
面试常常会问到这个问题。 实际就是同步和异步的区别。函数
定义: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的特点与优势。