인터페이스 내부에서 구조체를 반환하는 Go 함수 유형
Go에서는 구조체의 동작을 정의하기 위해 인터페이스를 사용하는 것이 일반적입니다. 그러나 인터페이스를 구현하는 구조체를 반환하는 함수로 작업할 때 유형 안전성 오류가 발생할 수 있습니다.
문제 이해
제공한 코드 예제를 살펴보겠습니다.
package expensive type myStruct struct { ... } // Struct with time-consuming methods func CreateInstance() *myStruct { ... } // Expensive factory function
package main import "expensive" type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }
여기서 다음을 반환하는 팩토리 함수 CreateInstance를 정의했습니다. *myStruct. 그런 다음 *myStruct가 구현하는 myInterface 인터페이스를 만들었습니다. 그러나 myInterface를 반환하는 함수가 필요한 structToConstruct의 필드에 팩토리 함수를 할당하여 컴파일 오류가 발생했습니다.
문제 해결
이 문제를 해결하려면 두 가지 옵션이 있습니다:
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
func CreateInstance() myInterface { return &myStruct{} }
옵션 1이 필요한 이유 작동
옵션 1에서 래퍼 함수는 CreateInstance의 결과를 myInterface로 변환한 후 이를 FactoryFunction에 할당합니다. 이는 래퍼 함수가 예상 함수 유형과 일치하기 때문에 structToConstruct의 유형 서명을 충족합니다.
옵션 2에 제안 12754가 필요한 이유
옵션 2에서 직접 시도하는 경우 CreateInstance를 FactoryFunction에 할당하면 CreateInstance가 인터페이스가 아닌 구조화된 포인터를 반환하기 때문에 Go가 불만을 표시합니다. 제안 12754에서는 이러한 과제를 지원하기 위해 언어를 확장할 것을 제안했지만 결국 거부되었습니다.
위 내용은 인터페이스를 구현하는 구조체를 반환하는 Go 함수를 어떻게 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!