혼합 값 제약 조건이 있는 제네릭 유형에서 호환되지 않는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 중국어 웹사이트의 기타 관련 기사를 참조하세요!