協程是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的特點與優勢。