如何为Go语言中可调用len()的类型编写类型约束?
Go中实现支持所有可调用
len()类型的泛型约束 你想要实现一个能适配所有可通过内置len()函数获取长度的类型的泛型约束,包括字符串、自定义切片、映射、通道、数组等。下面是具体的解决思路和实现:
问题分析
你之前的尝试存在两个核心问题:
- 第一种约束
~string | []any | ~map[any]any仅支持字符串、[]any切片和map[any]any映射,无法匹配[]User这类自定义元素类型的切片——因为[]User的底层类型是[]User,而非[]any。 - 第二种带类型参数的
Measurable接口,会导致函数签名过于繁琐,且编译器难以自动推断类型参数,进而引发编译错误。
正确实现
利用Go泛型的类型集特性,直接在泛型函数的类型参数中定义所有支持len()的类型模式,编译器会自动推断所需的类型参数,无需手动指定:
func LenOf[T ~string | ~[]E | ~map[K]V | ~chan C | ~[N]E, E any, K comparable, V any, C any, N int](t T) int { return len(t) }
使用示例
以下是覆盖所有支持len()类型的调用示例:
package main import "fmt" type User struct { Name string } func LenOf[T ~string | ~[]E | ~map[K]V | ~chan C | ~[N]E, E any, K comparable, V any, C any, N int](t T) int { return len(t) } func main() { fmt.Println(LenOf("hello")) // 输出:5 fmt.Println(LenOf([]User{{"Alice"}, {"Bob"}})) // 输出:2 fmt.Println(LenOf(map[string]int{"a":1, "b":2})) // 输出:2 fmt.Println(LenOf(make(chan int, 3))) // 输出:3 fmt.Println(LenOf([4]float64{1.0, 2.0})) // 输出:4 }
这个实现可以适配所有Go语言中支持len()的类型,调用时无需手动传递类型参数,编译器会自动完成推断。
内容的提问来源于stack exchange,提问作者kamstrup
相关产品推荐
相关产品推荐

