Golang中的泛型

Golang中的泛型

泛型函数是一种通用函数。它能接受不同类型的参数。

1
2
3
4
5
6
7
func Foo[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}

对于函数Foo的参数m map[K]V

  • K 接受 comparable 泛型约束。comparable包括所有能进行比较的类型(int8 ,uint16, float32, string…)。
  • V 接受int64 | float64泛型约束。V可以是两者中的任意一个。

使用接口

为什么使用接口

  • 实现对参数类型约束本身的代码复用。
1
2
3
4
5
6
7
8
9
10
11
12
type Number interface {
int64 | float64 // 可复用!
}

// 为什么K的约束为comparable?
func Foo[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
  • 使用参数类型提供的方法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // From "github.com/2023-Melting-Backend"
    type sth interface {
    db.User | db.Template | db.ProposalInfo | db.Tag | db.Question | db.Game
    TableName() string
    GetKey() (string, int)
    }

    func UpdateSth[T sth](value T) error {
    pk, id := value.GetKey()
    result := db.DB.Table(value.TableName()).Updates(value).Where(pk+" = ?", id)
    return result.Error
    }

如果不在接口中规定方法,编译会报错(即使约束中所有类型都实现了相关方法)。

参考


Golang中的泛型
https://a48zhang.github.io/2023/04/09/generic/
作者
a48zhang
发布于
2023年4月9日
许可协议