首页 >后端开发 >Golang >如何在 Go 泛型函数中迭代切片并集?

如何在 Go 泛型函数中迭代切片并集?

Linda Hamilton
Linda Hamilton原创
2025-01-05 05:31:08219浏览

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