> 백엔드 개발 > Golang > Go에서 인터페이스를 구현하는 구조체를 반환하는 함수를 할당하는 방법은 무엇입니까?

Go에서 인터페이스를 구현하는 구조체를 반환하는 함수를 할당하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-06 20:28:13
원래의
888명이 탐색했습니다.

How to Assign a Function Returning a Struct Implementing an Interface in Go?

인터페이스와 함께 구조체를 반환하는 Go 함수 유형 사용

질문:

Go에는 구조체가 하나 있습니다. 인터페이스를 구현하는 패키지입니다. 다른 종속 패키지에서는 테스트 목적으로 이 구조체의 가짜 구현을 만들고 싶습니다. 그러나 인터페이스를 구현하는 구조체를 반환하는 함수를 해당 인터페이스의 변수에 할당하려고 하면 Go에서 유형 안전성에 대해 불평합니다.

Architecture:

// Package expensive
type myStruct struct{}

func (m *myStruct) DoSomething() {...}
func (m *myStruct) DoSomethingElse() {...}
func CreateInstance() *myStruct {...} // Expensive to call

// Package main
type myInterface interface {
    DoSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}
func (s *structToConstruct) performAction() {...}
로그인 후 복사

오류:

"비싼.CreateInstance를 사용할 수 없습니다(func() 유형 *expensive.myStruct) 필드 값의 func() myInterface 유형"

답변:

CreateInstance 함수가 *myStruct 값을 반환하기 때문에 문제가 발생합니다. FactoryFunction에 필요한 func() myInterface 유형에서. 이 문제를 해결하려면:

// Package main
type myInterface interface {
    DoSomething()
}

type myStruct struct{}

func (m *myStruct) DoSomething() {...}

func getInstance() myInterface {
    return &myStruct{}
}
로그인 후 복사

이 수정을 통해 이제 getInstance는 myInterface 유형을 반환하여 이를 FactoryFunction에 할당할 수 있습니다.

추가 참고 사항:

  • 원래 질문에는 구조체가 아닌 구조체에 대한 포인터를 반환하는 함수 유형이 포함되었습니다. 유형 불일치의 원인이 되는 구조체 자체입니다.
  • 원래 코드에서 이 동작을 구현하려면 래퍼 함수를 ​​사용할 수 있습니다.
wrapper := func() myInterface {
    return expensive.CreateInstance()
}
로그인 후 복사

위 내용은 Go에서 인터페이스를 구현하는 구조체를 반환하는 함수를 할당하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿