ホームページ  >  記事  >  バックエンド開発  >  golangのメソッドのレシーバーがポインターである場合とポインターではない場合の違い

golangのメソッドのレシーバーがポインターである場合とポインターではない場合の違い

藏色散人
藏色散人転載
2021-05-14 14:55:142088ブラウズ

次のチュートリアル コラムでは、golang のメソッドの受信側がポインターである場合とそうでない場合の違いを紹介します。困っている友人の役に立てば幸いです。 golang のメソッドの受信側がポインターである場合とポインターではない場合の違い

序文

最近、クラスメートが次のような質問をしている Web サイトを読みました。 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()
}
したがって、学生の皆さんは、プログラミングでこのような問題に遭遇したときは注意を払う必要があります。

では、これらのメソッド セット間の関係は何ですか? ここで私は、 golang の学習から qyuhen さんのノートを借りました。また、golang が好きな友達にもこの本を読むことをお勧めします。golang の理解を深めるのに非常に役立ちます。

• タイプ T メソッド セットには、すべての受信機 T が含まれています方法。

• タイプ
T メソッド セットには、すべての受信側 T

T メソッドが含まれます。

• 型 S に匿名フィールド T が含まれる場合、S メソッド セットには T メソッドが含まれます。
• 型 S に匿名フィールド

T が含まれる場合、S のメソッド セットには T 個の
T メソッドが含まれます。

• T または
T の埋め込みに関係なく、S メソッドのセットには常に T *T メソッドが含まれます。

結論golang はシンプルで使いやすいですが、まだ多くの落とし穴があります。筆者は golang を使用する過程で多くの落とし穴に遭遇しました。これについては、ブログで説明します。後ほど。どなたでも歓迎です。一緒に話し合ってください。

以上がgolangのメソッドのレシーバーがポインターである場合とポインターではない場合の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。