關於golang中方法的receiver為指標和不為指標的區別

藏色散人
發布: 2021-04-19 19:43:40
轉載
1366 人瀏覽過

下面由golang教學欄位來介紹golang中方法的receiver為指標和不為指標的差別,希望對需要的朋友有幫助!

關於golang中方法的receiver為指標和不為指標的區別

golang中方法的receiver為指標和不為指標的區別

前言

最近看網站有同學提問golang中方法的receiver為指標和不為指標有什麼區別,在這裡我以簡單易懂的方法進行說明,幫助剛學習golang的同學.

方法是什麼

其實只要明白這個原理,基本上就能理解上面提到的問題.

方法其實就是一種特殊的函數,receiver就是隱式傳入的第一實參.

#舉例

type test struct{ name string } func (t test) TestValue() { } func (t *test) TestPointer() { } func main(){ t := test{} m := test.TestValue m(t) m1 := (*test).TestPointer m1(&t) }
登入後複製

是不是很簡單就明白了呢?現在我們來加入程式碼,來看看指標和非指標有什麼差別.

type test struct{ name string } func (t test) TestValue() { fmt.Printf("%p\n", &t) } func (t *test) TestPointer() { fmt.Printf("%p\n", t) } func main(){ t := test{} //0xc42000e2c0 fmt.Printf("%p\n", &t) //0xc42000e2e0 m := test.TestValue m(t) //0xc42000e2c0 m1 := (*test).TestPointer m1(&t) }
登入後複製

估計有的同學已經明白了,當不是指標時傳入實參後值發生了複製.所以每調用一次TestValue()值就發生一次複製.
那如果涉及到修改值的操作,結果會是怎樣呢?

type test struct{ name string } func (t test) TestValue() { fmt.Printf("%s\n",t.name) } func (t *test) TestPointer() { fmt.Printf("%s\n",t.name) } func main(){ t := test{"wang"} //这里发生了复制,不受后面修改的影响 m := t.TestValue t.name = "Li" m1 := (*test).TestPointer //Li m1(&t) //wang m() }
登入後複製

所以各位同學在程式設計遇到此類問題一定要注意了.
那這些方法集之間到底是什麼關係呢?這裡借用了qyuhen在golang讀書筆記的話,這裡也推薦喜歡golang的朋友去閱讀這本書,對加深理解golang有很大的幫助.

• 類型T 法集包含全部receiver T 法。
• 類型T 法集包含全部 receiver TT 法。
• 如類型 S 包含匿名欄位 T,則 S 法集包含 T 法。
• 如類型 S 包含匿名欄位T,則 S 法集包含 TT 法。
• 不管嵌入 T 或T,S 法集合總是包含 T *T 法。

結語

golang雖然上手簡單易用,但是還是有很多坑.作者在使用golang過程中就遇到很多坑,後面會在博客中提出,歡迎大家一起討論.

以上是關於golang中方法的receiver為指標和不為指標的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!