如題,原本基礎資料型別學習指針很快就弄懂,但是遇到struct時卻被搞混了,code如下:
x := 10
var px *int //宣告指針變數
px = &x //把x的指針傳入px
fmt.Println(px) //輸出地址0xc00009c000
fmt.Println(*px) //輸出地址0xc00009c000
//struct用法:
type person struct {
name string
age int32
}
man := person{
name: "John",
age: 45,
}
var pman *person //宣告指針變數
pman = &man //傳入man的指針
fmt.Println(pman) //輸出&{John 45}(這裡不是應該輸出地址嗎?)
fmt.Println(pman.name) //輸出John(竟然可以直接存取實例)
fmt.Println(*pman) //輸出{John 45}(實際測試效果和直接用pman一樣)
fmt.Println(&pman) //輸出0xc000012030
不能明白的是,為什麼宣告自定義型別的指針變數,傳給他實例化的變數指針,該指針變數能直接取用實例化後的值(屬性),而不像int的指針變數,是保存並輸出地址。
一開始有疑問是自使用套件時定義func (x *Foo) {},
發現function內竟然可以不用*直接調用x實例,難道這是struct自己的特殊用法嗎?
還請各位Golang大神幫小弟解惑,感激不盡!!
先回答你的問題
https://github.com/golang/tour/issues/226
還有基本上 pointer 的用法不管是對什麼資料型別是一樣的
只是差在對上 struct 可能有被 fmt 轉換,或是其他地方直接解析你才能看到原來的數值
這部分我去查資料也沒找到說是在哪裡,為什麼
但是實際上他還是有的 & 字號表示這是 pointer
要看有沒有差別的話,只要去寫兩個 method,一個有用 pointer,另一個沒有
改變 value 後 print 就可以觀察到了