Go에서 인터페이스 포인터에 대한 메서드 호출
Go에서는 인터페이스에 대해 프로그래밍할 때 다음을 수행할 수 있어야 하는 상황에 직면할 수 있습니다. 인터페이스 값에 대한 포인터에 대한 메서드를 호출합니다. 이는 인터페이스 자체에서 직접 노출되지 않는 기본 메서드에 액세스하려는 경우에 발생할 수 있습니다.
다음 시나리오를 고려하세요.
package main import "fmt" // SqlExecutor interface type SqlExecutor interface { Get(i interface{}, key interface{}) (interface{}, error) } // GorpDbMap and GorpTransaction implement SqlExecutor type GorpDbMap struct{} type GorpTransaction struct{} func (db GorpDbMap) Get(i interface{}, key interface{}) (interface{}, error) { return nil, nil } func (tx GorpTransaction) Get(i interface{}, key interface{}) (interface{}, error) { return nil, nil } func main() { // Initialize a GorpDbMap or GorpTransaction dbMap := GorpDbMap{} transaction := GorpTransaction{} // Create a repository that uses the SqlExecutor interface repo := Repository{ // This will result in an error Gorp: &dbMap, } // Try to call Get method on the pointer to the SqlExecutor interface obj, err := repo.GetById(1, 2) if err != nil { fmt.Println(err) } fmt.Println(obj) } // Repository demonstrates calling methods on interface pointers type Repository struct { Gorp SqlExecutor } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
위 코드를 실행할 때 다음 오류가 발생합니다.
r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)
이 오류는 Get 메서드를 호출하기 전에 SqlExecutor 인터페이스 값에 대한 포인터가 제대로 역참조되지 않기 때문에 발생합니다. 메서드.
이 문제를 해결하려면 별표 연산자(*)를 사용하여 인터페이스 값에 대한 포인터를 역참조해야 합니다. 이는 다음과 같이 코드를 수정하여 수행할 수 있습니다.
func main() { // Initialize a GorpDbMap or GorpTransaction dbMap := GorpDbMap{} transaction := GorpTransaction{} // Create a repository that uses the SqlExecutor interface repo := Repository{ Gorp: &dbMap, } // Try to call Get method on the pointer to the SqlExecutor interface obj, err := (*repo.Gorp).Get(1, 2) if err != nil { fmt.Println(err) } fmt.Println(obj) }
인터페이스 값에 대한 포인터를 역참조함으로써 이제 인터페이스를 구현하는 구조체의 기본 메서드에 액세스할 수 있습니다. 이 경우 GorpDbMap 구조체의 Get 메서드가 성공적으로 호출됩니다.
Go에서는 일반적으로 값에 포인터를 전달하는 것보다 값별로 값을 전달하는 것을 선호한다는 점에 유의하는 것이 중요합니다. 이렇게 하면 원래 값이 의도치 않게 수정되는 것을 방지할 수 있습니다. 인터페이스의 경우 일반적으로 인터페이스 값에 대한 포인터가 아닌 인터페이스 값 자체를 전달해야 합니다.
위 내용은 Go에서 인터페이스 포인터의 메서드를 올바르게 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!