阅读type constraint文档
This commit is contained in:
@@ -132,8 +132,62 @@ func SumFloats(m map[string]float64) float64 {
|
||||
|
||||
`type parameter`通常都带代表一系列类型的集合,但是在编译时type parameter则是代表由调用方传递的`type argument`类型。如果type argument类型不满足type constraint的要求,那么该代码则不会被成功编译。
|
||||
|
||||
type parameter必须要支持`generic code`中执行的所有操作。
|
||||
|
||||
```go
|
||||
// SumIntsOrFloats sums the values of map m. It supports both int64 and float64
|
||||
// as types for map values.
|
||||
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
|
||||
var s V
|
||||
for _, v := range m {
|
||||
s += v
|
||||
}
|
||||
return s
|
||||
}
|
||||
```
|
||||
#### comparable
|
||||
在上述示例中,`K`的constraint为`comparable`,go中预先声明了该constraint。comparable约束代表其可以类型可以通过`==`或`!=`符号来进行比较。
|
||||
|
||||
golang中要求key类型为comparable。
|
||||
|
||||
上述示例中,V的类型约束为`float64 | int64`,`|`符号代表取两种类型的并集,实际类型可以为两种类型中的任何一种。
|
||||
|
||||
### 泛型方法调用
|
||||
```go
|
||||
// 指定类型参数
|
||||
fmt.Printf("Generic Sums: %v and %v\n",
|
||||
SumIntsOrFloats[string, int64](ints),
|
||||
SumIntsOrFloats[string, float64](floats))
|
||||
|
||||
// 不指定类型参数
|
||||
fmt.Printf("Generic Sums, type parameters inferred: %v and %v\n",
|
||||
SumIntsOrFloats(ints),
|
||||
SumIntsOrFloats(floats))
|
||||
```
|
||||
在调用golang的泛型方法时,可以省略类型参数,此时编译器会推断类型参数类型,但是对于部分场景,例如没有参数只有返回值的参数`func returnObj[V any]() V`,此时泛型类型无法被推断,只能手动指定。
|
||||
|
||||
### type constraint
|
||||
在golang中,支持将泛型约束声明为接口,并在多个地方重用该接口。通过将约束声明为接口,可以避免复杂泛型约束的重复声明。
|
||||
|
||||
可以将泛型constraint声明为接口,并且允许任何类型实现该接口,将接口用作type constraint的指定,那么传递给方法的任何类型参数都要实现该接口,包含该接口中所有的方法。
|
||||
|
||||
代码示例如下:
|
||||
```go
|
||||
type Number interface {
|
||||
int64 | float64
|
||||
}
|
||||
|
||||
// SumNumbers sums the values of map m. It supports both integers
|
||||
// and floats as map values.
|
||||
func SumNumbers[K comparable, V Number](m map[K]V) V {
|
||||
var s V
|
||||
for _, v := range m {
|
||||
s += v
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
fmt.Printf("Generic Sums with Constraint: %v and %v\n",
|
||||
SumNumbers(ints),
|
||||
SumNumbers(floats))
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user