前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2014年12月22日 Go生态洞察:Go语言中的代码生成

2014年12月22日 Go生态洞察:Go语言中的代码生成

作者头像
猫头虎
发布2024-04-09 14:04:06
1200
发布2024-04-09 14:04:06
举报
文章被收录于专栏:猫头虎博客专区

2014年12月22日 Go生态洞察:Go语言中的代码生成

📚 摘要

大家好,我是猫头虎,今天我们来探讨Go 1.4版本中引入的一个强大的新功能——代码生成。这个功能不仅展示了通用计算的强大之处,也为Go语言的软件工程实践带来了全新的可能性。让我们一起深入了解代码生成的魔力吧!

🌟 引言

通用计算的一个重要属性——图灵完备性——意味着计算机程序可以编写计算机程序。这是一个强大的概念,但却没有得到应有的重视。现在,随着Go 1.4的发布,我们得以在Go语言中更方便地实现这一点。

🚀 正文

🤖 代码生成的概念

代码生成指的是一个程序输出另一个程序的源代码。这是软件工程中的一个重要元素,常见于编译器的定义中。例如,go test命令就是通过扫描要测试的包,写出为该包定制的测试装置的Go程序,然后编译并运行它。

🛠️ 工具和示例
  • Yacc:读取语法描述并输出解析该语法的程序。
  • Protocol Buffer编译器:读取接口描述并输出结构定义、方法等支持代码。
🌐 Go 1.4中的go generate

Go 1.4引入了一个新命令go generate,通过扫描Go源代码中的特殊注释来识别并运行通用命令。值得注意的是,go generate并不是go build的一部分。它没有依赖分析,并且在运行go build之前必须显式运行。它旨在被Go包的作者使用,而不是其客户端。

🖥️ 使用go generate

例如,使用Go的Yacc工具生成Yacc语法:

安装Go的Yacc工具:

代码语言:javascript
复制
go get golang.org/x/tools/cmd/goyacc

假设有一个名为gopher.y的Yacc输入文件,定义了新语言的语法。要生成实现该语法的Go源文件,通常会这样调用命令:

代码语言:javascript
复制
goyacc -o gopher.go -p parser gopher.y

要使用go generate来驱动这个过程,在同一目录下的任何一个常规(非生成的).go文件中,添加以下注释:

代码语言:javascript
复制
//go:generate goyacc -o gopher.go -p parser gopher.y

运行go generate,然后构建和测试:

代码语言:javascript
复制
$ cd $GOPATH/myrepo/gopher
$ go generate
$ go build
$ go test
🚀 stringer工具

stringergolang.org/x/tools仓库中的一个新程序,它自动为整数常量集编写字符串方法。虽然可以单独运行,但它主要是由go generate驱动的。

🧩 示例

设想我们有一些代码,包含定义不同类型药丸的整数常量集:

代码语言:javascript
复制
package painkiller

type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)

使用stringer,只需添加一个生成注释,即可让go generatePill类型生成String方法。输出默认写入pill_string.go

🧭 其他应用

Go

语言中已经有许多其他使用go generate的实例,包括在unicode包中生成Unicode表、在encoding/gob中创建数组的编码和解码方法等。

📊 总结

go generate虽然没有提供Make或其他构建机制无法做到的功能,但它无需额外安装即与go工具一起提供,并且很好地融入了Go生态系统。请创造性地使用go generate,它鼓励实验。本文已被猫头虎的Go生态洞察专栏收录,详情点击这里

📚 参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2014年12月22日 Go生态洞察:Go语言中的代码生成
    • 📚 摘要
      • 🌟 引言
        • 🚀 正文
          • 🤖 代码生成的概念
          • 🌐 Go 1.4中的go generate
          • 🚀 stringer工具
          • 🧭 其他应用
        • 📊 总结
          • 📚 参考资料
          相关产品与服务
          腾讯云服务器利旧
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档