go 泛型以后会支持特例化吗

2022-08-06 10:44:08 +08:00
 kkhaike

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:
  }
}
3358 次点击
所在节点    Go 编程语言
14 条回复
bosskwei
2022-08-06 10:56:58 +08:00
你这是动态语言的写法,像 py 一样 isinstance 。编译型语言应该是 func IsEmpty[T comparable](x T) bool 这样写
weirdte
2022-08-06 10:58:26 +08:00
@bosskwei 特化,rust 和 cpp 支持的
tairan2006
2022-08-06 11:13:19 +08:00
你这个也不是不能搞,你写一个接口把 case 对应的接口全写进去,然后 T 用这个接口做约束…就是用起来很烦。

或者你还是用 switch t.(type)这种非泛型思路写吧。
Trim21
2022-08-06 11:25:31 +08:00
很可能不会支持…

go 的博客里有这么一句话

“write Go programs by writing code, not by defining types”
cubecube
2022-08-06 11:32:23 +08:00
@Trim21 哈哈,我倒是感觉以后没准会,毕竟 JAVA 的基础类型泛型特例化都要来
lance6716
2022-08-06 11:58:16 +08:00
如果自己根据类型不同,写成 IsEmpty1 ,IsEmpty2 ,有什么不方便使用的呢?

这里不方便的点,就是编译时难处理的点
dragonsunmoon
2022-08-06 12:06:17 +08:00
唉...go 的泛型还是一个残废呀
泛型与 go 的语言设计思想就是背道而驰的, 即便弄出个泛型, 也是这种夹生饭.
24bit
2022-08-06 15:32:08 +08:00
短期不用想
zizon
2022-08-06 17:47:06 +08:00
你有没想过限定 T 为某个 type interface { IsEmpty bool() }?
lysS
2022-08-06 18:27:39 +08:00
可以把基础类型定义为自定义类型,然后通过“泛型接口”

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
Aloento
2022-08-06 19:00:53 +08:00
在 golang 里面搞这些也不太现实,毕竟 golang 这种语言的目标就是一把梭快速开发
Manweill
2022-08-06 20:05:52 +08:00
来.NET 吧,你想到的都有
bruce0
2022-08-06 21:38:26 +08:00
@lysS 这篇文章真的干, 看了半个多小时 好多知识还是没能消化😭
wewewefff
2022-08-07 20:06:12 +08:00
GO 是最简单的方式,完成最好的效果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX