go學習筆記2

默認自動初始化:

Go引入了零值的概念,即每個對象被創建的時候,默認初始化爲它相應類型的零

值。例如,string爲””,指針爲nil,int爲0等等,這樣就保證了變量在使用時,不會因爲忘

記初始化而出現一些莫名其妙的問題


OOP在Go中是通過組合而非繼承來實現的,因爲“繼承”存在一些弊端,比如

:“不適應變化”,“會繼承到不適用的功能”。所以在編碼實踐中一般建議優先使用組合而

非繼承。在Go中則更進一步,直接去掉了繼承,只支持組合。在定義struct時,採用匿名

組合的方式,也更好地實現了C++中的“實現”繼承,而在定義interface時,也可以實現接

口繼承


Go對併發的支持,採用的是CSP模型,即在代碼編寫的時候遵循“通過通信來共

享內存,而非通過共享內存來通信”的原則


func goroutine(pass chan bool) {

fmt.Println("hello, i'm in the goroutine")

pass <- true

}

func main() {

pass := make(chan bool)

go goroutine(pass)

<-pass

fmt.Println("passed")

}


Go的interface與Java等的interface相比優勢在於:

1. 按需定義,最小化重構的代價。

2. 先實現後抽象,搭配結構嵌入,在編寫大型軟件的時候,我們的模塊可

以組織得耦合度更低。


new與變量初始化

在Go中,new與delete和在C++中的含義是不一樣的。delete用以刪除一個

map項,而new用以獲得一個指向某種類型對象的指針,而因爲Go支持類似如下的語法

type T struct {

}

obj := &T{} . obj = new(T)

同時Go提供另一個關鍵字make用以創建內建的對象,所以&T{}這種語法與

make合起來,就基本可以替代new(但目前new(int)這類基本類型指針的創建,則無法用

&T{}的寫法),因此new看起來有點冗餘了,這與Go的簡單原則有點不一致。


For…range不能用於自定義類型

爲了遍歷的方便,Go提供了for-range語法,但是這種構造只能用於built-in類型,

如slice、map和chan;而對於非built-in類型,即使官方包container中的相關數據結構也

不行,這降低了for-range的易用性。而目前在不支持泛型的前提下,要實現一個很友好的

for-range看起來還是很不容易的。

這個果然蛋疼,怪不得我不能用range遍歷list了。。。


以上來自《go語言評估報告》


@一個切片的長度永遠不能超出它的容量。---?不是相當於vector可以動態增長的嗎???

a := [...]int{1,2,3,4,5} // The ... means "whatever length the initializer has"

len(a) //=> 5

/* Slice from the middle */

s := a[2:4] //=> [3 4]

len(s), cap(s) //=> 2, 3

/* Grow the slice */

s = s[0:3] //=> [3 4 5]

len(s), cap(s) //=> 3, 3

/* Cannot grow it past its capacity */

s = s[0:4] // this is a compile error


Go有兩種方式直接創建切片而不用引用底層存

儲:

/* literal */

s1 := []int{1,2,3,4,5}

/* empty (all zero values) */

s2 := make([]int, 10) // cap(s2) == len(s2) == 10


Go語言不支持繼承,至少與大多數語言的繼承不一樣。並不存在類型的層次結構。相較於繼承,Go鼓勵使用組合和委派,併爲此提供了相應

的語法甜點使其更容易接受


channel的阻塞行爲並非永遠是最佳的。該語言提供了兩種對其進行定製的方式:

1. 程序員可以指定緩衝大小——想緩衝的channel發送消息不會阻塞,除非緩衝已滿,同樣從緩衝的channel讀取也不會阻塞,除非緩

衝是空的。

2. 該語言同時還提供了不會被阻塞的發送和接收的能力,而操作成功是仍然要報告。

/* Create a channel with buffer size 5 */

ch := make(chan int, 5)

/* Send without blocking, ok will be true if value was buffered */

ok := ch <- 42

/* Read without blocking, ok will be true if a value was read */

val, ok := <-ch


《go初級讀本》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章