Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

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-17
    12
  • AlphaAMOGTopCracker
    现在支持了吧?
    2023-10-21归属地:上海
    1
    4
  • 年年有余
    可以,对Go了解更深了
    2021-02-24
    1
  • pc
    求问:跑.sh文件的时候,直接term中执行能成功,但是go generate去跑,就报错“running "./gen.sh": fork/exec ./gen.sh: exec format error”。有人指导吗😂
    2021-06-16
    2
  • bestgopher
    type 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-13
    1
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部