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) // 输出 "李四"
person
を person
型を指すポインタ変数として定義し、ポインタ型メソッド ChangeName()# を使用すると、それがわかります。
##Name 属性を変更すると、元の
Person 変数の
Name 属性も変更されます。
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() メソッドを通じてカウンター値を取得します。
func (p *Person) ChangeAge(age int) { p.Age = age } person := &Person{Name: "张三", Age: 20} person.ChangeAge(21)上記のコードでは、
ChangeAge() メソッドは、
Person 変数の
Age 属性を変更するために使用されるポインター メソッドです。
Person は構造体型であるため、値型の変数が渡されるたびにメモリ割り当てが発生します。ただし、
ChangeAge() メソッドがポインタ メソッドとして定義されている場合、メモリの割り当てを回避できます。
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 メソッド ポインターのいくつかの重要な概念と使用法についての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。