인터페이스 구현을 위한 구조체를 반환하는 Go 함수 유형
시간이 많이 걸리는 메서드와 팩토리가 포함된 패키지에 구조체가 있는 시나리오를 고려해보세요. 기능. 이 구조체를 효과적으로 테스트하려면 가짜 팩토리 함수와 일단 생성된 가짜 구조체를 모두 활용하는 것이 바람직합니다.
다음 코드는 이를 예시합니다.
package expensive import "fmt" type myStruct struct{} func (m *myStruct) DoSomething() { fmt.Println("In Do something") } func (m *myStruct) DoSomethingElse() { fmt.Println("In Do something else") } // CreateInstance is expensive to call func CreateInstance() *myStruct { return &myStruct{} }
종속 패키지에서 우리는 인터페이스합니다. 다음과 같습니다:
package main import "play/expensive" func main() { thing := structToConstruct{expensive.CreateInstance} thing.performAction() } type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction() instance.DoSomething() }
그러나 이 코드는 오류:
.\main.go:6: cannot use expensive.CreateInstance (type func() *expensive.myStruct) as type func() myInterface in field value
myInterface를 구현하는 *expensive.myStruct에도 불구하고 Go는 유형 안전성에 대해 불평합니다.
Go 팀에 따르면 이 동작은 의도적인 것입니다.
Having a function type in a struct field that returns the underlying concrete type would violate a core principle of interfaces. That principle is that the concrete type can be replaced by any other implementation of the interface type. If the receiver type of a function were the underlying concrete type, the behavior of the function would change if called via an interface.
해결책은 팩토리 기능을 래핑하는 것입니다.
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
이것은 래퍼가 myInterface를 준수하고 코드가 컴파일됩니다.
위 내용은 인터페이스 구현에 구조체를 반환하는 Go 함수 유형을 어떻게 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!