Golang Go语言中泛型有什么实现思路么?
有思考过,go 实现泛型确实不像 java 那么方便,毕竟 java 单继承。 除了像 C++那样大动干戈,维护一套新东西,go 还有什么思路能比较好的实现泛型,又不会性能太差么?( reflect 性能很差)
Golang Go语言中泛型有什么实现思路么?
- 收购 alphabet
2. 暴改 golang
更多关于Golang Go语言中泛型有什么实现思路么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
为什么要实现泛型,使用代码生成器为每种类型生成相应的代码不可以吗
1 代码生成
2 反射
#3 泛型其实就是方便写库的兄弟,,方便封装通用的算法, 这样代码就跟类型关系不大了,静态语言这个玩意几乎是必须的,偏偏 Golang 不支持,语言并不是越简单越好,工程实践中讲究的是取舍,C++在配合 Google 编程规范 也会成为很好的语言。
代码生成只是一种妥协方案,但在修改的时候非常不便,一般需要修改生成程序甚至要重新生成代码。
反射要写很多很 trick 的代码,看着太烦,要求性能时也有很大障碍。
泛型是一种优雅的方案。
不可能考虑所有类型吧,所谓泛型无非在整型与浮点型之间泛,直接一律以字符串为参数,传参时把类型转成字符串,泛型函数里先 parseInt, parseFloat,再计算
不怕死上 unsafe
接口 跟 ducktype 不行吗…把传入传出也用接口封装起来啊
模板,但是没有元编程
目前 go 不支持范型,2.0 以后计划会提供泛型支持
golang 现在这样很好了,千万不要引入泛型。
2.0 以后
go 以后也不会支持了,因为 go 已经提供了对代码生成的支持
千万别加什么泛型
个人觉得泛型是静态语言特有的一种提高抽象度的方法,同时不引入额外性能开销,不用泛型也的确可以获得同样高级的抽象能力,但势必要采用动态语言那一套,typeid,反射什么的,有很多额外的数据结构需要维护,还有额外的类型擦除 /标识 /转换操作,楼上提到的一律转字符串也好 ducktype 也好都是这种思路,这种思路在开发的时候能简化很多重复业务逻辑,但开发库的时候并没什么卵用,很多标准库的实现都是出乎意料的简单暴力,因为库开发,提供的接口一定是确定的,有范围的,能传入传出什么数据本来就是库说得算,根本不怎么会需要动态类型能力,这个时候考虑的只有算法对不同类型的适配度,泛型是一个恰到好处的实现
代码生成器,其实就是泛型的本质,对特定类型生成同样固定流程的代码,但总归是泛型的 workaround 而已,没有泛型本身那么好用
泛型和 oo 是两码事,没有泛型编码量太大
写库就不能代码生成了?
用 unsafe.Pointer 传参可以解决一些问题,但是 caller 那边势必要写的非常难看
传入的 struct 需要加入一个 field 表示类型,overhead 不可避免,还会引起内存对齐问题。
让我想起了那个手动泛型的 sublime gif
golang 天下第一,是世界上最好的语言。golang 的设计全都是圣经,一字不能改,golang 没有的全都是奇技淫巧,是撒旦诱惑你下地狱的。
所以,golang 要什么泛型(手动斜眼笑
你是不是没见过一门正常点的强类型语言?
童鞋,你这个 2.0 实现泛型是官方消息?
在Go语言中,泛型(Generics)的实现思路主要围绕类型参数(Type Parameters)和类型集(Type Sets)展开,旨在提供一种灵活的方式来编写可以处理多种数据类型的代码,同时保持类型安全。
Go语言的泛型设计遵循了几个核心原则:简单性、明确性和性能。为了实现这些目标,Go引入了类型参数列表和类型约束的概念。类型参数列表允许函数、类型或方法声明时指定一组类型参数,而类型约束则用来限制这些类型参数可以是哪些类型,从而确保类型安全。
在具体实现上,Go的泛型通过编译时的类型替换和类型检查来工作。当使用泛型代码时,编译器会根据提供的具体类型参数生成相应的代码实例。这种机制使得泛型代码能够在运行时保持高效,因为所有的类型检查和转换都在编译阶段完成。
此外,Go的泛型还考虑到了向后兼容性和易用性。通过引入类型别名和类型推断等特性,Go使得泛型代码更加简洁和易于理解。同时,Go的泛型也避免了过度复杂化语言本身,保持了Go语言的简洁和优雅。
总的来说,Go语言的泛型实现思路是结合了类型参数、类型约束和编译时类型替换等机制,旨在提供一种灵活、高效且易于使用的泛型编程方式。这使得开发者能够编写出更加通用和可复用的代码,同时保持Go语言的独特风格和优势。