diff --git a/Golang/Golang Document.md b/Golang/Golang Document.md index c323f38..e083bfd 100644 --- a/Golang/Golang Document.md +++ b/Golang/Golang Document.md @@ -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)) +```