iT邦幫忙

0

關於Golang的指針在基礎型別與struct的應用差別

  • 分享至 

  • xImage

如題,原本基礎資料型別學習指針很快就弄懂,但是遇到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大神幫小弟解惑,感激不盡!!

froce iT邦大師 1 級 ‧ 2023-05-03 07:55:03 檢舉
https://juejin.cn/post/7167566924929318919

golang會自動解引用和取引用,和C有所不同。
基本上就是讓對指針觀念不熟的能夠容錯。
就我學的經驗,go的確比rust好學多了。
jojoman iT邦新手 5 級 ‧ 2023-05-03 21:20:38 檢舉
感謝大大,參照您的連結的資訊後來又去爬了點文,原來這是Go對於struct的指針的故意設計。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
whitefloor
iT邦研究生 2 級 ‧ 2023-05-03 13:57:05
最佳解答

先回答你的問題
https://github.com/golang/tour/issues/226

還有基本上 pointer 的用法不管是對什麼資料型別是一樣的
只是差在對上 struct 可能有被 fmt 轉換,或是其他地方直接解析你才能看到原來的數值
這部分我去查資料也沒找到說是在哪裡,為什麼
但是實際上他還是有的 & 字號表示這是 pointer

要看有沒有差別的話,只要去寫兩個 method,一個有用 pointer,另一個沒有
改變 value 後 print 就可以觀察到了

jojoman iT邦新手 5 級 ‧ 2023-05-03 21:18:10 檢舉

感謝大大,照連結裡的fmt.Printf就可以印出struct指針變數的地址了,後來也參考了上面froce大大的連結,原來GO在struct使用指針時可以直接取得實例的屬性,這好像是故意設計的。

我要發表回答

立即登入回答