>백엔드 개발 >Golang >인터페이스를 구현하는 구조체를 반환하는 Go 함수를 어떻게 처리할 수 있나요?

인터페이스를 구현하는 구조체를 반환하는 Go 함수를 어떻게 처리할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-08 04:18:09519검색

How Can I Handle Go Functions Returning Structs Implementing Interfaces?

인터페이스 내부에서 구조체를 반환하는 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의 필드에 팩토리 함수를 할당하여 컴파일 오류가 발생했습니다.

문제 해결

이 문제를 해결하려면 두 가지 옵션이 있습니다:

  1. 래퍼 기능: 당신 기본 패키지 내에서 팩토리 기능을 래핑할 수 있습니다. 예:
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
  1. 수정된 팩토리 함수: 또는 CreateInstance를 수정하여 myInterface를 직접 반환할 수 있습니다.
func CreateInstance() myInterface { return &myStruct{} }

옵션 1이 필요한 이유 작동

옵션 1에서 래퍼 함수는 CreateInstance의 결과를 myInterface로 변환한 후 이를 FactoryFunction에 할당합니다. 이는 래퍼 함수가 예상 함수 유형과 일치하기 때문에 structToConstruct의 유형 서명을 충족합니다.

옵션 2에 제안 12754가 필요한 이유

옵션 2에서 직접 시도하는 경우 CreateInstance를 FactoryFunction에 할당하면 CreateInstance가 인터페이스가 아닌 구조화된 포인터를 반환하기 때문에 Go가 불만을 표시합니다. 제안 12754에서는 이러한 과제를 지원하기 위해 언어를 확장할 것을 제안했지만 결국 거부되었습니다.

위 내용은 인터페이스를 구현하는 구조체를 반환하는 Go 함수를 어떻게 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.