[Golang] 指標 Pointers
Pointers @ A Tour of Go
TL;DR
- 會需要「mutate」原本資料的 methods 就需要傳入的是 pointer
- 單純是「顯示」原本資料用的 methods 就不需要傳入 pointer
// *T 是一種型別,指的是能夠指向該 T 的值的指標,它的 zero value 是 nil
// *T means pointer to value of type T
var p *int // nil
// &variable 會產生該 variable 的 pointer
i := 42
p := &i // & 稱作 address of pointer
fmt.Println(p) // 0xc0000b4008
fmt.Println(*p) // 透過 pointer 來讀取到 i
// 當 function receiver 這裡使用了 *type 時
// 這裡拿到的 p 會變成 pointer,指的是存放 p 的記憶體位址
func (p *person) updateNameFromPointer(newFirstName string) {
// *variable 表示把該指摽對應的值取出
p.firstName = newFirstName // 等同於 (*p).firstName = newFirstName
}
// 當沒有使用 *type 時
// 每次傳進來的 p 都會是複製一份新的(by value)
func (p person) updateName(newFirstName string) {
p.firstName = newFirstName
}
func main() {
jim := {
firstName: "Jim"
}
jim.updateNameFromPointer("Aaron") // It works as expected
jim.updateName("Aaron") // It doesn't work as expected
}