実はこの原理を理解していれば、上で述べた問題をほぼ理解することができます。
メソッドは実際には特別な関数であり、 #例: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() }
では、これらのメソッド セット間の関係は何ですか? ここで私は、 golang の学習から qyuhen さんのノートを借りました。また、golang が好きな友達にもこの本を読むことをお勧めします。golang の理解を深めるのに非常に役立ちます。
• タイプ T メソッド セットには、すべての受信機 T が含まれています方法。• タイプ
T メソッド セットには、すべての受信側 T
• 型 S に匿名フィールド T が含まれる場合、S メソッド セットには T メソッドが含まれます。
• 型 S に匿名フィールド
T メソッドが含まれます。• T または
T の埋め込みに関係なく、S メソッドのセットには常に T *T メソッドが含まれます。
結論golang はシンプルで使いやすいですが、まだ多くの落とし穴があります。筆者は golang を使用する過程で多くの落とし穴に遭遇しました。これについては、ブログで説明します。後ほど。どなたでも歓迎です。一緒に話し合ってください。