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 인터페이스 값에서 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 개체에 대한 포인터를 만들고 이를 개인 인터페이스 값에 할당합니다. 그런 다음 개인 인터페이스 값이 가리키는 개체를 변경하면 새 개체에서 Greet 메서드가 호출됩니다. 이는 기본 개체가 아닌 인터페이스 값 자체를 수정하기 때문입니다.
일반적으로 Go 코드에서 인터페이스 값에 대한 포인터를 사용할 필요는 없습니다. 그러나 꼭 사용해야 하는 경우에는 일반 값에 대한 포인터와 다르게 동작한다는 점을 기억하는 것이 중요합니다.
위 내용은 Go에서 메서드를 호출할 때 인터페이스 포인터는 어떻게 동작하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!