>백엔드 개발 >Golang >왜 다른 유형 인수를 가진 Go의 일반 유형을 서로 할당할 수 없나요?

왜 다른 유형 인수를 가진 Go의 일반 유형을 서로 할당할 수 없나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-19 11:22:09577검색

Why Can't Go's Generic Types with Different Type Arguments Be Assigned to Each Other?

동일한 유형의 일반 인스턴스를 서로 할당할 수 없는 이유는 무엇입니까?

Go에서는 일반 유형의 인스턴스를 다른 유형으로 할당하는 것을 금지합니다. 형식 인수가 인터페이스 관계를 충족하는 경우에도 서로 인수합니다. 이를 설명하기 위해 다음 코드를 고려하십시오.

type Generic interface {
    ID() string
}

type Props[G Generic] struct{}

type Example struct {
    id string
}

func (example Example) ID() string {
    return example.id
}

var ExampleProps = Props[Example]{}

func Problem() Props[Generic] {
    return ExampleProps
}

이 코드를 실행하면 컴파일 오류가 발생합니다.

cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement

이 오류는 새 유형 인수로 일반 유형을 인스턴스화하면 생성되기 때문에 발생합니다. 독특한 유형. 구체적으로:

  • Props[Example]은 명명된 유형이고
  • Props[Generic]는 또 다른 명명된 유형입니다.

이 두 유형은 그렇지 않습니다. 예제가 Generic을 구현한다는 사실에도 불구하고 상호 교환이 가능합니다. 따라서 Props[Generic]에 예제Props(Props[Example]의 인스턴스)를 할당하는 것은 유효하지 않습니다.

이 동작은 any로 인스턴스화된 제네릭으로 확장됩니다. any는 단지 빈 인터페이스(interface{})의 별칭을 지정하는 정적 유형입니다. 이는 "모든 유형" 또는 T와 동일하지 않습니다. 따라서 any로 인스턴스화된 유형은 다른 특정 유형으로 인스턴스화된 유형에 할당할 수 없습니다.

이 문제를 해결하려면 유형 매개변수를 사용하여 Props를 인스턴스화할 수 있습니다. , 함수의 입력 및 출력 유형이 모두 일관되도록 합니다. 예:

type Props[G Generic] struct{ Value G }

func Problem[T Generic](v T) Props[T] {
    return Props[T]{ Value: v }
}

func main() {
    a := Problem(Example{})
    fmt.Println(a)
}

위 내용은 왜 다른 유형 인수를 가진 Go의 일반 유형을 서로 할당할 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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