方法method
-GO方法雖沒有class,依舊有method
-通過顯示說明receiver來實作與某個類型的組合
-隻能為同一個包中的類型定義方法
-RECEIVER可以是類型的值或指針
-不存在方法重載
-可以使用值或指針來調用方法,編譯器會自動完成轉換
-從某種意義上來說,方法是函數的文法糖,因為receiver其實就是方法所接收的第一個參數
-如果外部結構和嵌入結構存在同名方法,則優先調用外部結構的方法
-類型别名不會擁有底層類型所附帶的方法
-方法可以調用結構中的非公開字段
##method:
接口interface
-接口是一個或多個方法簽名的集合
反射reflection
并發concurrency
Channel
-Channel是goroutine溝通的橋梁,大都是阻塞同步的
-通過make建立,close關閉
-Channel是引用類型
package main
import "fmt"
import "time"
func main(){
c :=make(chan bool)
go func(){
fmt.Println("GO GO GO")
c <-true
}()
<-c
time.Sleep(2*time.Second)
}
-可以使用for range 來疊代不斷操作channel
//import "time"
close(c)
for v :=range c{
fmt.Println(v)
-可以設定單項或雙向通道
-可以設定緩存大小,在未被填滿前不會發生阻塞
import "runtime"
runtime.GOMAXPROCS(runtime.NumCPU())
c :=make(chan bool,10)
for i :=0;i<10;i++{
go Go(c,i)
func Go(c chan bool,index int){
a :=1
for i :=0;i<100000000;i++{
a+=1
fmt.Println(index,a)
c<-true
等價///
import "sync"
wg :=sync.WaitGroup{}
wg.Add(10)
go Go(&wg,i)
wg.Wait()
func Go(wg *sync.WaitGroup,index int){
wg.Done()
Select
-可處理一個或多個channel的發送與接收
-同時有多個可用的channel時按随機順序處理
-可用空的select來阻塞main函數
-可設定逾時
本文轉自 DBAspace 51CTO部落格,原文連結:http://blog.51cto.com/dbaspace/1963461