golang チュートリアル の次の列では、golang のメソッドの受信側の違いについて詳しく説明します。 . これがポインタではなく、ポインタであることを願っています。困っている人たちを助けてください!
まえがき 最近、あるウェブサイトを読んだ学生が、golang のメソッドのレシーバーがポインタである場合とそうでない場合の違いは何ですかと尋ねました。ポインタです。ここでは、シンプルで理解しやすいようにします。golang を学習したばかりの学生を助けるために、方法を説明します。方法とは実際、あなたがする限り、この原理を理解すると、基本的に上記の問題を理解できるようになります。メソッドは実際には特別な関数であり、レシーバは暗黙的に渡される最初のパラメータです。#例
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 での読書メモ (https://github.com/qyuhen/book) を拝借します。 golang のようにこの本を読んでください。これは、golang の理解を深めるのに非常に役立ちます。
• タイプ T メソッド セットには、すべてのレシーバー T メソッドが含まれています。結論golang はシンプルで使いやすいですが、落とし穴もたくさんあります。筆者は golang を使用する過程で多くの落とし穴に遭遇しました。ブログで言及します。後で。誰でも歓迎です。一緒に話し合ってください。• タイプ
T メソッド セットには、すべての受信側 T T メソッドが含まれます。 • 型 S に匿名フィールド T が含まれる場合、S メソッド セットには T メソッドが含まれます。
• 型 S に匿名フィールド
T が含まれる場合、S のメソッド セットには T 個の T メソッドが含まれます。 • T または
T の埋め込みに関係なく、S メソッドのセットには常に T *T メソッドが含まれます。
以上がgolangのメソッドのレシーバーがポインターである場合とそうでない場合の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。