
RT ,网上搜不到有相关计划的言论和类似的问题。。
最近有个工具库想改成泛型。发现没有特例化根本写不出来。连 isEmpty 这种都写不出来。(samber/lo 的 IsEmpty 只能作用于 comparable )。
其他语言泛型之所以这么花很大的原因就是特例化。。
我在想如果函数本身特例化不好实现。以后会不会方法实现类似于
func IsEmpty[T any](x T) bool { switchtype T { case comparable: var zero T return x == zero case xxx: 其他实现,每个 case 块做到 build 隔离, 要不 如果是 uncomparable 类型,就无法构建 == 了 case YYY: } } 1 bosskwei Aug 6, 2022 你这是动态语言的写法,像 py 一样 isinstance 。编译型语言应该是 func IsEmpty[T comparable](x T) bool 这样写 |
3 tairan2006 Aug 6, 2022 你这个也不是不能搞,你写一个接口把 case 对应的接口全写进去,然后 T 用这个接口做约束…就是用起来很烦。 或者你还是用 switch t.(type)这种非泛型思路写吧。 |
4 Trim21 Aug 6, 2022 via Android 很可能不会支持… go 的博客里有这么一句话 “write Go programs by writing code, not by defining types” |
6 |
7 dragonsunmoon Aug 6, 2022 唉...go 的泛型还是一个残废呀 泛型与 go 的语言设计思想就是背道而驰的, 即便弄出个泛型, 也是这种夹生饭. |
8 24bit Aug 6, 2022 短期不用想 |
9 zizon Aug 6, 2022 你有没想过限定 T 为某个 type interface { IsEmpty bool() }? |
10 lysS Aug 6, 2022 可以把基础类型定义为自定义类型,然后通过“泛型接口” type CanEmptyT interface { ~int | ~string | ~[]byte Empty() bool } type SliceByte []byte func (sb SliceByte) Empty() bool { if sb == nil || *(*int)(unsafe.Add(unsafe.Pointer(&sb), 8 /*WORD*/)) == 0 { return true } else { return false } } func DoSomething[T CanEmptyT](v T) { if v.Empty() { fmt.Println("null") } else { fmt.Println(v) } } func main() { var a SliceByte DoSomething(a) var b []byte DoSomething[SliceByte](b) } 这种泛型与接口结合的方法我觉得可以使 go 达到“完备”;但是目前有性能损失: https://www.infoq.cn/article/xprmcl5qbf6yvdroajyn |
11 Aloento Aug 6, 2022 在 golang 里面搞这些也不太现实,毕竟 golang 这种语言的目标就是一把梭快速开发 |
14 wewewefff Aug 7, 2022 GO 是最简单的方式,完成最好的效果 |