>백엔드 개발 >Golang >Go 일반 함수에서 슬라이스 결합을 반복하는 방법은 무엇입니까?

Go 일반 함수에서 슬라이스 결합을 반복하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-05 05:31:08256검색

How to Iterate Over a Union of Slices in Go Generic Functions?

일반 함수의 슬라이스 합집합에 대한 반복

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를 모두 포함하므로 핵심 유형이 없습니다.

이 문제를 해결하려면 다음과 같은 몇 가지 접근 방식이 있습니다.

  1. 공통 기본 유형 적용:
    인터페이스 제약 조건을 수정하여 기본 유형을 지정하고 슬라이스를 규정합니다. 함수 시그니처 내에 유형을 입력하세요.

    type Number interface {
        int64 | float64
    }
    
    func add[N Number](n []N) {
        for _, v := range n {
            fmt.Println(v)
        }
    }
  2. 명시적 유형 지정과 함께 제네릭 사용:
    요소 유형을 지정하는 일반 슬라이스 유형을 선언하고 명시적 유형 지정을 사용합니다. 원하는 요소를 나타내기 위해 유형:

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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