その方法とは
実際、この原理を理解していれば、上記の問題は基本的に理解できます。
メソッドは実際には特別な関数であり、レシーバーは暗黙的に渡される最初の実パラメータです。例を教えてください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) }
一部の生徒は、実際のパラメータがポインタでない場合に渡されると、値がコピーされることをすでに理解していると思います。
それでは、これらのメソッド セットの関係は何ですか? ここでは、qyuhen の golang 学習ノートを借りました。これもお勧めです。golang が好きな友人は、この本を読んでください。golang への理解が深まるでしょう。• タイプ T メソッド セットには、すべての受信側 T メソッドが含まれます。
• タイプ
T メソッドが含まれます。
• 型 S に匿名フィールド T が含まれる場合、S メソッド セットには T メソッドが含まれます。
T が含まれる場合、S のメソッド セットには T 個のT メソッドが含まれます。
• T または T の埋め込みに関係なく、S メソッドのセットには常に T *T メソッドが含まれます。
結論
golang はシンプルで使いやすいですが、まだ多くの落とし穴があります。筆者は golang を使用する過程で多くの落とし穴に遭遇しました。これについては、ブログで説明します。後ほど。どなたでも歓迎です。一緒に話し合ってください。