일반 함수의 슬라이스 합집합에 대한 반복
Go의 제네릭을 사용하면 함수가 다양한 유형에서 작동할 수 있으므로 코드 재사용이 가능하고 유형 안전. 그러나 다양한 요소 유형의 슬라이스로 작업할 때 일반 함수 내에서 이를 반복할 때 문제가 발생할 수 있습니다.
잠재적으로 정수 또는 부동 소수점을 포함하는 슬라이스의 요소를 요약하는 것을 목표로 하는 다음 예를 고려해보세요.
package main import "fmt" // NumberSlice constraint type NumberSlice interface { []int64 | []float64 } func add[N NumberSlice](n N) { // want: to range over n and print value of v for _, v := range n { fmt.Println(v) } } func main() { ints := []int64{1, 2} add(ints) }
이 코드를 실행하면 다음 오류가 발생합니다.
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
문제는 NumberSlice 인터페이스 제약조건에 대한 "핵심 유형"입니다. 핵심 유형은 인터페이스 유형 세트의 모든 유형이 공유하는 단일 기본 유형을 나타냅니다. NumberSlice는 []int64와 []float64를 모두 포함하므로 핵심 유형이 없습니다.
이 문제를 해결하려면 다음과 같은 몇 가지 접근 방식이 있습니다.
공통 기본 유형 적용:
인터페이스 제약 조건을 수정하여 기본 유형을 지정하고 슬라이스를 규정합니다. 함수 시그니처 내에 유형을 입력하세요.
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
명시적 유형 지정과 함께 제네릭 사용:
요소 유형을 지정하는 일반 슬라이스 유형을 선언하고 명시적 유형 지정을 사용합니다. 원하는 요소를 나타내기 위해 유형:
type NumberSlice[N int64 | float64] interface { ~[]N // indicates a core type of []N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
코어 유형을 지정하면 컴파일러가 적절한 반복 동작을 추론하여 일반 함수 내에서 슬라이스를 반복하는 원하는 작업을 활성화할 수 있습니다.
위 내용은 Go 일반 함수에서 슬라이스 결합을 반복하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!