亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網
    最全最豐富的資訊網站

    詳解golang中方法的receiver為指針和不為指針的區(qū)別

    下面由golang教程欄目給大家詳解golang中方法的receiver為指針和不為指針的區(qū)別,希望對需要的朋友有所幫助!

    詳解golang中方法的receiver為指針和不為指針的區(qū)別

    golang中方法的receiver為指針和不為指針的區(qū)別

    前言

    最近看網站有同學提問golang中方法的receiver為指針和不為指針有什么區(qū)別,在這里我以簡單易懂的方法進行說明,幫助剛剛學習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)     }

    是不是很簡單就明白了呢?現在我們來加入代碼,來看看指針和非指針有什么區(qū)別.

    type test struct{     name string }  func (t test) TestValue() {     fmt.Printf("%pn", &t) }  func (t *test) TestPointer() {     fmt.Printf("%pn", t) }  func main(){     t := test{}     //0xc42000e2c0     fmt.Printf("%pn", &t)          //0xc42000e2e0     m := test.TestValue     m(t)          //0xc42000e2c0     m1 := (*test).TestPointer     m1(&t)      }

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

    type test struct{     name string }  func (t test) TestValue() {     fmt.Printf("%sn",t.name) }  func (t *test) TestPointer() {     fmt.Printf("%sn",t.name) }  func main(){     t := test{"wang"}      //這里發(fā)生了復制,不受后面修改的影響     m := t.TestValue          t.name = "Li"     m1 := (*test).TestPointer     //Li     m1(&t)              //wang     m() }

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

    ? 類型 T 法集包含全部 receiver T 法。
    ? 類型 T 法集包含全部 receiver T + T 法。
    ? 如類型 S 包含匿名字段 T,則 S 法集包含 T 法。
    ? 如類型 S 包含匿名字段 T,則 S 法集包含 T + T 法。
    ? 不管嵌 T 或 T,S 法集總是包含 T + *T 法。

    結語

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

    贊(0)
    分享到: 更多 (0)
    網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號