06 | Go 编程模式:Go Generation
陈皓
你好,我是陈皓,网名左耳朵耗子。
这节课,我们来学习一下 Go 语言的代码生成的玩法。
Go 语言的代码生成主要还是用来解决编程泛型的问题。泛型编程主要是解决这样一个问题:因为静态类型语言有类型,所以,相关的算法或是对数据处理的程序会因为类型不同而需要复制一份,这样会导致数据类型和算法功能耦合。
我之所以说泛型编程可以解决这样的问题,就是说,在写代码的时候,不用关心处理数据的类型,只需要关心相关的处理逻辑。
泛型编程是静态语言中非常非常重要的特征,如果没有泛型,我们就很难做到多态,也很难完成抽象,这就会导致我们的代码冗余量很大。
现实中的类比
为了帮你更好地理解,我举个现实当中的例子。我们用螺丝刀来做打比方,螺丝刀本来只有一个拧螺丝的作用,但是因为螺丝的类型太多,有平口的,有十字口的,有六角的……螺丝还有不同的尺寸,这就导致我们的螺丝刀为了要适配各种千奇百怪的螺丝类型(样式和尺寸),也是各种样式的。
而真正的抽象是,螺丝刀不应该关心螺丝的类型,它只要关注自己的功能是不是完备,并且让自己可以适配不同类型的螺丝就行了,这就是所谓的泛型编程要解决的实际问题。
Go 语方的类型检查
因为 Go 语言目前并不支持真正的泛型,所以,只能用 interface{} 这样的类似于 void* 的过度泛型来玩,这就导致我们要在实际过程中进行类型检查。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何在Go语言中使用代码生成来解决泛型编程的问题。作者首先解释了泛型编程的重要性,并通过现实中的例子和对Go语言中类型检查的技术进行了说明。然后,作者介绍了C++中使用模板解决泛型编程问题的方式,并探讨了在Go语言中使用代码生成来实现类似功能的可能性。最后,作者详细介绍了如何使用Go Generator来生成代码,包括函数模板、生成脚本和生成代码的示例。通过本文,读者可以了解到在Go语言中使用代码生成来解决泛型编程问题的方法,以及其优势和实际操作步骤。文章还介绍了如何在Go语言中使用代码生成来解决泛型编程问题的方法,以及其优势和实际操作步骤。文章还介绍了如何在Go语言中使用代码生成来解决泛型编程问题的方法,以及其优势和实际操作步骤。
该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- neohope泛型实现方式 1、C 通过void*和强制类型转换来实现,也可以通过宏来实现类似功能,一般只会用作简单的实现 2、C++ 模板类的模板具体化,预编译时生成不同的类,分别进行编译,代码会膨胀,但由于不需要在运行时进行任何的类型识别,程序也会变得比较干净,运行效率也更高。 3、JAVA 基于类型擦除,在编译泛型类时将强制消除类型信息;JVM运行时泛型类并不知道自己处理的具体是何种类型。 4、Go 当前版本不支持泛型,可以通过 interface{}强制转换实现泛型。 也可以通过第三方库,实现模板库类型的泛型。 5、C# 泛型类在编译生成中间码IL时,通用类型T只是一个占位符。 在实例化类时,根据实际数据类型代替T并由即时编译器(JIT)生成本地代码运行,不同封闭类的本地代码是不一样的。 6、JS、Python 动态类型天然支持泛型2021-03-1712
- AlphaAMOGTopCracker现在支持了吧?2023-10-21归属地:上海14
- 年年有余可以,对Go了解更深了2021-02-241
- pc求问:跑.sh文件的时候,直接term中执行能成功,但是go generate去跑,就报错“running "./gen.sh": fork/exec ./gen.sh: exec format error”。有人指导吗😂2021-06-162
- bestgophertype assertion 的第二个值不应该是一个bool值嘛?怎么会是一个error?2021-04-18
- 林创彬👌go语言目前不支持泛型,是牺牲了编码效率,保持编译速度和运行效率。2021-03-28
- 许沛东“interface{} 这样的类似于 void* 的过度泛型”, 这句话是什么意思。是不是说类似 Java 中 Object。或者说,过渡?充当泛型语义?2021-03-01
- Mew151皓神,有个疑问,在“SED 简明教程”这篇文章中,以下这个例子: --------------------------------------------------- $ sed 's/This is my \([^,&]*\),.*is \(.*\)/\1:\2/g' my.txt cat:betty dog:frank fish:george goat:adam --------------------------------------------------- 我试了一下,把\([^,&]*\)改为\(.*\)或者\([^,]*\),输出的结果是一样的,那么我想问: 1、&这个符号在这里的作用是什么 2、使用\(.*\)或\([^,]*\)跟\([^,&]*\)的含义是否是完全一样的?2021-01-131
收起评论