ホームページ  >  記事  >  バックエンド開発  >  golangのメソッドの受け取り側がポインタである場合とそうでない場合の違いについて

golangのメソッドの受け取り側がポインタである場合とそうでない場合の違いについて

藏色散人
藏色散人転載
2021-04-19 16:56:401468ブラウズ

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

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

golangのメソッドの受け取り側がポインタである場合とそうでない場合の違いについて

序文

I最近ウェブサイトで学生からの質問を見ました 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)    

}

一部の生徒は、実際のパラメータがポインタでない場合に渡されると、値がコピーされることをすでに理解していると思います。

それでは、これらのメソッド セットの関係は何ですか? ここでは、qyuhen の golang 学習ノートを借りました。これもお勧めです。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 までご連絡ください。