SqlExecutor インターフェイスを実装する Gorp ライブラリを使用している場合、試行中に問題が発生する可能性があります。インターフェイス値へのポインターのメソッドを呼び出します。この混乱は、Go が「参照による呼び出し」の概念に厳密に従っていないために発生します。
Go では、共通のメソッドを持つオブジェクトのグループを表すためにインターフェイスが使用されます。インターフェイスに値を割り当てると、実際にはそのオブジェクトへの参照が保存されるのではなく、オブジェクトの値へのポインターが保存されます。これは、インターフェイス値でメソッドを呼び出すと、実際には基になるオブジェクトでメソッドを呼び出していることを意味します。
次の例を考えてみましょう。
package main import ( "fmt" ) type Person struct { Name string } func (p *Person) Greet() { fmt.Println("Hello, my name is", p.Name) } func main() { // Create a person object p := Person{Name: "John"} // Create an interface value that points to the person object var person interface{} = p // Call the Greet method on the interface value person.Greet() // Output: Hello, my name is John }
この例では、 person オブジェクトを取得し、それを person インターフェイスの値に割り当てます。次に、person インターフェイス値に対して Greet メソッドを呼び出すと、基になる Person オブジェクトに対して Greet メソッドが正しく呼び出されます。これは、インターフェイス値が実際には Person オブジェクトを指しているためです。
インターフェイス値へのポインターとなると、状況はもう少し混乱する可能性があります。 Go では、通常、インターフェイス値へのポインターを使用する必要はありません。これが必要となる唯一のシナリオは、インターフェイス値自体を変更する必要がある場合です。たとえば、インターフェイス値が指しているオブジェクトを変更したい場合は、インターフェイス値へのポインターを使用する必要があります。
例を次に示します。
package main import ( "fmt" ) type Person struct { Name string } func (p *Person) Greet() { fmt.Println("Hello, my name is", p.Name) } func main() { // Create a person object p := Person{Name: "John"} // Create a pointer to the person object pPtr := &p // Create an interface value that points to the person object var person interface{} = pPtr // Change the object that the interface value is pointing to person = &Person{Name: "Jane"} // Call the Greet method on the interface value person.Greet() // Output: Hello, my name is Jane }
Inこの例では、Person オブジェクトへのポインターを作成し、それを person インターフェイス値に割り当てます。次に、person インターフェイスの値が指しているオブジェクトを変更すると、新しいオブジェクトに対して Greet メソッドが呼び出されます。これは、基になるオブジェクトではなくインターフェイス値自体を変更しているためです。
一般に、Go コードでインターフェイス値へのポインターを使用する必要はありません。ただし、これらを使用する必要がある場合は、通常の値へのポインタとは動作が異なることに留意することが重要です。
以上がGo でメソッドを呼び出すとき、インターフェイス ポインタはどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。