>백엔드 개발 >Golang >Go Generics에서 혼합 유형 제약 조건을 사용할 때 In CompatibleAssign 오류를 방지하는 방법은 무엇입니까?

Go Generics에서 혼합 유형 제약 조건을 사용할 때 In CompatibleAssign 오류를 방지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-28 10:21:10651검색

How to Avoid IncompatibleAssign Errors When Using Mixed Type Constraints in Go Generics?

혼합 값 제약 조건이 있는 제네릭 유형에서 호환되지 않는AssignError 관리

Go에서 제네릭을 사용하면 해당 필드에 특정 제약 조건이 있는 유형을 생성할 수 있습니다. 그러나 구조체 필드에 값 리터럴을 할당하면 제약 조건에서 서로 다른 유형 그룹을 혼합할 때 In CompatibleAssign 오류가 발생할 수 있습니다.

다음 예를 고려하세요.

type constraint interface {
    ~float32 | ~float64
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14
}

이 코드는 리터럴 3.14를 val에 할당합니다. foo[float64] 유형의 필드입니다. 3.14는 유효한 float64 값이기 때문에 허용됩니다.

그러나 int 유형을 포함하도록 제약 조건을 확장하면 오류가 발생합니다.

type constraint interface {
    ~float32 | ~float64 | ~int
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}

이 오류는 메서드 선언에서 발생합니다.

func (f *foo[float64]) setValToPi() {
    // ...
}

여기서 float64는 의도한 제약이 아닌 유형 매개변수 이름으로 처리됩니다. 결과적으로 컴파일러는 val 필드의 특정 유형을 결정할 수 없으며 3.14가 가능한 모든 제약 조건 인스턴스와 호환되는지 확인할 수 없습니다.

이 문제를 해결하려면 일반 메서드 매개 변수를 사용하여 값을 허용해야 합니다. 대신 유형 매개변수 유형을 사용하세요.

func (f *foo[T]) SetValue(val T) {
    f.val = val
}

이 솔루션은 3.14와 같은 고정 값을 할당하는 것을 방지합니다. 이는 이 맥락에서 부적절한 관행입니다. 대체 접근 방식은 필드 유형으로 any/interface{}를 사용하는 것입니다.

위 내용은 Go Generics에서 혼합 유형 제약 조건을 사용할 때 In CompatibleAssign 오류를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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