Go에서 인터페이스 포인터에 대한 메서드 호출
Go에서는 인터페이스에 대해 프로그래밍하고 인터페이스를 수정하지 않고 트랜잭션을 사용해야 하는 경우가 있습니다. 암호. 일반적인 접근 방식은 "개체"에 대한 포인터를 필드 속성에 전달하여 필요한 경우 롤백을 활성화하는 것입니다. 그러나 이 접근 방식은 혼란을 초래할 수 있습니다.
코드 예제를 고려해 보겠습니다.
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp *gorp.SqlExecutor // Pointer to SqlExecutor } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) // Call method on pointer if err != nil { panic(err) } return obj }
여기서 롤백을 수행하려면 Gorp "객체"에 대한 포인터가 필요하다고 생각할 수 있습니다. 그러나 Go의 몇 가지 주요 개념을 이해하는 것이 중요합니다.
예제 코드에서는 Gorp SqlExecutor에 대한 포인터가 있더라도 인터페이스 포인터 자체에서 메서드를 호출할 수 없습니다. 대신 기본 값에 대한 메서드를 호출하고 있습니다. 이 경우 기본 값은 SqlExecutor 구조체입니다.
따라서 Repository 구조체에서 포인터를 안전하게 제거하고 SqlExecutor 인터페이스를 Repository에 전달할 수 있습니다.
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp gorp.SqlExecutor // Pointer removed } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
이것은 코드는 예상대로 작동하며 기본 SqlExecutor를 수정하지 않고도 트랜잭션을 사용할 수 있습니다. 이 컨텍스트에서는 인터페이스에 포인터를 전달하는 것에 대해 걱정할 필요가 없습니다.
위 내용은 Go에서 메서드를 호출할 때 인터페이스 값에 대한 포인터를 사용하지 말아야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!