GoLang之类型约束
注:本文已Go SDK v1.18进行讲解
1.语法“|”
type Addable interface {
int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | uintptr | float32 | float64 | complex64 | complex128 | string
}
2.语法“,”
新的方式还还有额外的用途,也就是不用每次都定义一个接口约束,不过,这种方式建议只在少数类型约束时才适合,否则可读性太差。
package main
import (
"fmt"
)
func add[T int,float64](a, b T) T {
return a + b
}
func main() {
fmt.Println(add(1, 2))
fmt.Println(add(1.2, 2.3))
}
//输出:
// 3
// 3.5
注意[T int,float64]不能写成[T int|float64],否则会编译报错
3.语法“~”
在 Go 语言中,基于某类型定义新类型,有时可能希望泛型约束是某类型的所有衍生类型
约束 ~string 表示支持 string 类型以及底层是 string 类型的类型,因此 MyString 类型值也可以传递给 add。
package main
import (
"fmt"
)
// 约束允许底层类型是 string 的类型(包括 string 类型)
type a interface {
~string
}
func add[T a](x, y T) T {
return x + y
}
type MyString string
func main() {
var x string = "ab"
var y MyString = "cd"
fmt.Println(add(x, x))
fmt.Println(add(y, y))
//输出:
//abab
//cdcd
}
4.没有任何约束
// 没有任何约束
func add[T any](x, y T) T {
return y
}
func main() {
fmt.Println(add(1, 2))
//输出:2
}
5.单独定义约束
package main
import (
"fmt"
)
type Addble int
// 约束 Addble (需要单独定义)
func add[T Addble](x, y T) T {
return y
}
func main() {
fmt.Println(add(1, 2))
//输出:2
}