>백엔드 개발 >Golang >Go1.18 泛型初探

Go1.18 泛型初探

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-24 15:00:40919검색

오늘 구현하고 싶은 함수는 맵의 모든 값을 합산하는 것입니다.

제네릭이 아닌 함수

제네릭 없이 어떻게 구현하나요? 값은 제네릭 없이 int64, float64 등과 같은 다른 유형을 가질 수 있기 때문에 다른 유형은 다른 함수를 통해 구현되어야 하므로 일반적으로 다음과 같이 구현합니다.

func SumInts(m map[string]int64) int64 {
    var s int64
    for _, v := range m {
        s += v
    }
    return s
}

func SumFloats(m map[string]float64) float64 {
    var s float64
    for _, v := range m {
        s += v
    }
    return s
}

위 코드에서 우리는 정의합니다. 두 가지 함수:

1. SumInts()는 int64 유형으로 값의 합을 계산합니다. 2. SumFloats()는 float64 유형으로 값의 합을 계산합니다.

위 함수는 int64 및 float64 유형에만 적용됩니다. 여전히 int, float32 등을 계산하려면 위 함수를 다시 복사하고 유형을 수정해야 합니다.

이 작업을 수행하는 것이 조금 번거롭고 코드가 부풀어오르지 않나요? 말할 것도 없이 이전 표준 패키지에는 표준 라이브러리의 Sort 패키지(sort.go)와 같은 유사한 코드가 많이 있습니다. 다양한 유형의 슬라이스를 정렬하기 위해 IntSlice, Float64Slice, StringSlice가 정의됩니다.

이전 Go 버전은 제네릭을 지원하지 않았기 때문에 가장 간단한 방법이기도 한 이 방법으로만 구현할 수 있습니다.

제네릭을 사용하면 다양한 유형의 int64 및 float64에 대한 값의 합계를 계산하는 함수를 어떻게 구현할 수 있나요?

일반 함수

이 섹션에서는 일반 함수를 사용하여 매개변수로 값이 int64 유형인 맵 또는 매개변수로 값이 float64 유형인 맵을 구현합니다.

완전한 코드는 다음과 같습니다.

func Sum[K comparable, V int64 | float64](m map[K]V "K comparable, V int64 | float64") V {
 var s V
 for _, v := range m {
  s += v
 }
 return s
}

func main() {
 ints := map[string]int64{
  "first":  1,
  "second": 2,
 }
 fmt.Println(Sum[string, int64](ints "string, int64"))

 floats := map[string]float64{
  "first":  35.98,
  "second": 26.99,
 }
 fmt.Println(Sum[string, float64](floats "string, float64"))
}

위 코드에서는 일반 함수인 Sum() 함수를 정의했는데, 일반 함수와의 차이점은 다음과 같습니다. 함수 이름과 함수 매개변수 목록. 대괄호 []에는 대괄호 안에 두 개의 매개변수 K와 V가 있는데, 이는 Go 언어에서 유형 매개변수라고 합니다. K와 V 바로 뒤에는 유형 제한이 있습니다. Go 언어에 의해 미리 선언되었으며 == 및 != 작업을 수행하는 모든 A 유형을 나타냅니다. V의 유형 제한은 int64 및 float64 중 하나입니다. 함수 매개변수는 m, 타입은 map[K]V, 반환 타입은 V입니다.

함수를 호출하는 것도 일반 함수를 호출하는 것과 약간 다릅니다. 함수 이름과 실제 매개변수 사이에 유형 이름을 나타내는 대괄호 []가 있습니다. 예를 들어 Sum() 함수가 처음 호출되면 유형 이름은 각각 string과 int64입니다. 그런 다음 함수가 실행되면 K와 V의 해당 유형은 각각 string과 int64입니다.

第二次调用该 Sum() 函数时,K、V 的类型分别是 string 和 float64。

通过泛型编程,我们就可以实现一个函数处理多种数据类型。

执行上面的代码输出:

3
62.97

위 내용은 Go1.18 泛型初探의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
이전 기사:다음 기사: