這幾天累到連電腦都不想開...這樣不行,今天逼自己哪怕只學一個語法或複習也要看。
上次學完之後,無聊開了一個 easy 來寫,才發現自己連 array 都還不會用,剛好官方直接接在 defer 的下一個。
在 array 之前還遇到些老朋友,pointer && struct,以前學 C 的 ptsd 又回來了。
不過官方明確表明沒辦法做指標運算:
Unlike C, Go has no pointer arithmetic.
非常容易理解,指標運算實際上是對記憶體位址做運算,既然要保持 Memory Safety 就不可能讓使用者做這件事,甚至 GC 也會影響記憶體。
struct 就沒什麼特別的,考慮到 Memory Safety,fields 有自己的預設數值也不是什麼很難理解的事,不過目前看到這幾行第一時間還是會愣住就是了...
type Vertex struct {
X, Y int
}
var (
v1 = Vertex{1, 2} // has type Vertex
v2 = Vertex{X: 1} // Y:0 is implicit
v3 = Vertex{} // X:0 and Y:0
p = &Vertex{1, 2} // has type *Vertex
)
看到 array 後發現自己已經漸漸習慣型別寫在後面這件事,第一眼看到宣告的方式竟然沒感到意外:
var a [10]int
倒是 Print 出來之後預設的分割符號是「空白」,Python 寫多了的時候會以為整個 array 只有一項:
var a [2]string = [2]string{"hello", "World"}
fmt.Println(a)
primes := [6]int{2, 3, 5, 7, 11, 13}
fmt.Println(primes)
[hello World]
[2 3 5 7 11 13]
slice 就有點頭痛了,先不說第一次看的時候想說跟 array 差在哪,幹嘛特別分出來...
另外查了才知道 slice 本質上是這樣子的 struct:
type slice struct {
ptr *int
len int
cap int
}
再來是他的行為:
Go 一切均 pass by value,但 slice 是 reference-like (兩個 struct 的 pointer 的 value 相同),搞得最終很像 pass by reference。(寫過不同語言遇到類似的行為好痛苦)
兩個 struct 擁有相同的 ptr value 跟直接傳址還是有差異...
感覺類似的問題後面還會有很多,今天先這樣好了...