ホームページ  >  記事  >  バックエンド開発  >  Go メソッド ポインターのいくつかの重要な概念と使用法についての詳細な説明

Go メソッド ポインターのいくつかの重要な概念と使用法についての詳細な説明

PHPz
PHPzオリジナル
2023-04-25 10:42:18626ブラウズ

Go 言語では、メソッドは特定の型にバインドされた関数であり、その型のインスタンスを通じて呼び出すことができます。 Go は、カスタム型 (構造体、インターフェイス) や組み込み型 (文字列、配列など)、さらにはポインタ型を含むあらゆる型のメソッドを定義できます。

Go ではポインタ (Pointer) も型の 1 つです。ポインター型は任意の型の変数を指すことができ、変数の値はポインターを通じて変更できます。したがって、Go では、ポインター型に対してメソッドを定義することもできます。

以下では、Go メソッド ポインターの重要な概念と使用法について詳しく説明します。

値の型とポインターの型

最初に例を見て、Person 構造体を定義しましょう:

type Person struct {
    Name string
    Age  int
}

これで、acceptPerson 型パラメータ メソッド:

func (p Person) ChangeName(name string) {
    p.Name = name
}

ここでの p は、ポインタではなく、Person 型の値であることに注意してください。したがって、上記のメソッドを呼び出すと、新しい Person 値が作成され、変更は元の変数には影響しません。

person := Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "张三"

この状況を回避するには、Person ポインタ型を受け入れるメソッドを定義して、メソッド内で Person 変数が変更されると、新しいPerson 変数は作成されませんが、元の Person 変数を直接変更します。

func (p *Person) ChangeName(name string) {
    p.Name = name
}

person := &Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "李四"

personperson 型を指すポインタ変数として定義し、ポインタ型メソッド ChangeName()# を使用すると、それがわかります。 ##Name 属性を変更すると、元の Person 変数の Name 属性も変更されます。

ポインター メソッドと値メソッドの違い

Go 言語では、変数値を変更する上記の機能に加えて、値メソッドとポインター メソッドの間には他にもいくつかの違いがあります。

まず第一に、ポインター メソッドはレシーバー (型自体) を変更できますが、値メソッドは変更できません。

type Counter struct {
    count int
}

func (c *Counter) Add() {
    c.count++
}

func (c Counter) Get() int {
    return c.count
}

counter := Counter{count: 0}
counter.Add()
fmt.Println(counter.Get()) // 输出 1
上記のコードでは、

Add() メソッドはカウンターの値を増やすために使用されるポインター メソッドであり、Get() メソッドはvalue メソッド。カウンターの値を取得するために使用されます。ご覧のとおり、コードでは、最初に Add() メソッドを呼び出してカウンター値を増やし、次に Get() メソッドを通じてカウンター値を取得します。

もう 1 つの違いは、ポインター型をレシーバーとして使用すると、型をコピーする際のメモリ割り当てを回避できるため、プログラムのパフォーマンスが向上する可能性があることです。

func (p *Person) ChangeAge(age int) {
    p.Age = age
}

person := &Person{Name: "张三", Age: 20}
person.ChangeAge(21)
上記のコードでは、

ChangeAge() メソッドは、Person 変数の Age 属性を変更するために使用されるポインター メソッドです。 Person は構造体型であるため、値型の変数が渡されるたびにメモリ割り当てが発生します。ただし、ChangeAge() メソッドがポインタ メソッドとして定義されている場合、メモリの割り当てを回避できます。

非ポインタ型からポインタ型メソッドを呼び出す

Go 言語では、メソッドがポインタ型で定義されているが、非ポインタ型を使用してメソッドを呼び出す場合、コンパイラは自動的にポインタ型の呼び出しに変換されます。

func (p *Person) ChangeName(name string) {
    p.Name = name
}

person := Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "李四"
上記のコードでは、

person を値型の変数として定義しますが、変数の値は ChangeName() メソッドを通じて変更します。この場合、コンパイラは自動的に person をポインター型に変換し、ChangeName() メソッドを呼び出します。

概要

Go 言語では、ポインター型とメソッドの使用が非常に一般的です。新しいポインター型メソッドを作成することで、型をコピーする際のメモリ割り当てを回避できます。同時に、ポインタ メソッドによってレシーバを変更することもできます。さらに、非ポインター型を使用してポインター型メソッドを呼び出す場合、コンパイラーは呼び出しを自動的にポインター型に変換します。したがって、Go コードを記述するときは、パフォーマンスとプログラム構造を向上させるために、ポインターの型とメソッドを柔軟に使用することをお勧めします。

以上がGo メソッド ポインターのいくつかの重要な概念と使用法についての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。