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


🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁

🦄 博客首页——🐅🐾猫头虎的博客🎐
🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~💐

🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:

☁️🐳 Go语言开发者必备技术栈☸️:
🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥


在这里插入图片描述

文章目录

    • 🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
  • 2014年12月22日 Go生态洞察:Go语言中的代码生成
    • 📚 摘要
    • 🌟 引言
    • 🚀 正文
      • 🤖 代码生成的概念
        • 🛠️ 工具和示例
      • 🌐 Go 1.4中的`go generate`
        • 🖥️ 使用`go generate`
      • 🚀 `stringer`工具
        • 🧩 示例
      • 🧭 其他应用
    • 📊 总结
    • 📚 参考资料
    • 🔍 下一篇预告
  • 原创声明

  • 原创作者: 猫头虎

  • 作者wx: Libin9iOak

  • 作者公众号: 猫头虎技术团队

在这里插入图片描述

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语法:

  1. 安装Go的Yacc工具:

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

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

    //go:generate goyacc -o gopher.go -p parser gopher.y
    
  4. 运行go generate,然后构建和测试:

    $ cd $GOPATH/myrepo/gopher
    $ go generate
    $ go build
    $ go test
    

🚀 stringer工具

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

🧩 示例

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

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生态洞察专栏收录,详情点击这里。

📚 参考资料

  • Rob Pike. Generating code.
  • Go 1.4 Release Notes.
  • Yacc.

🔍 下一篇预告

下一篇文章,我们将探讨Go语言中的另一个有趣话题——全球首个Go语言黑客马拉松——Gopher Gala。敬请期待!

在这里插入图片描述

原创声明

======= ·

  • 原创作者: 猫头虎

  • 作者wx: Libin9iOak
    在这里插入图片描述

  • 作者公众号: 猫头虎技术团队

在这里插入图片描述

学习复习Go生态

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,洞察Go生态,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/180537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sui第七轮资助:八个项目共获得超过50万美元的资助

今日,Sui基金会宣布了本月获得资助的项目方,他们将获得超过50万美元的资助金,用于构建项目,推动Sui的采用和发展。要获得资助,项目必须提交提案,详细说明他们正在构建的内容、预算明细、关键里程碑、团队经…

Vue环境的搭建

1.Vue开发的两种方式 (1)核心包传统开发模式 基于html/css/js文件,直接引入和辛堡,开发Vue。 (2)工程化开发模式: 主要是基于构建工具(例如,webpack)的环境中开发Vue…

SpringBoot——感谢尚硅谷官方文档

SpringBoot——感谢尚硅谷官方文档 1 Spring与SpringBoot1、Spring能做什么1.1、Spring的能力1.2、Spring的生态1.3、Spring5重大升级1.3.1、响应式编程1.3.2、内部源码设计 2、为什么用SpringBoot2.1、SpringBoot优点2.2、SpringBoot缺点 3、时代背景3.1、微服务3.2、分布式分…

数据科学导论——数据预处理

第1关:引言-根深之树不怯风折,泉深之水不会涸竭 第2关:数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

Linux运行jmeter报错java.sql.SQLException:Cannot create PoolableConnectionFactory

在性能测试过程中遇见1个问题,终于解决了,具体问题如下。 问题 在windows电脑写jmeter脚本连接数据库连接成功 然后把该脚本放到Linux服务器上面,并把jmeter mysql驱动放到服务器上面,修改jmeter的mysql驱动路径信息 注意&…

并行与分布式计算 第9章 算法设计

文章目录 并行与分布式计算 第9章 算法设计9.1 设计过程9.1.1 PCAM设计过程9.1.2 划分9.1.3 通信9.1.4 组合9.1.5 映射 8.2 设计方法8.2.1 划分技术9.2.2 分治9.2.3 平衡树技术9.2.4倍增技术9.2.5 流水线技术9.2.6 破对称技术 并行与分布式计算 第9章 算法设计 9.1 设计过程 …

如何提高图片转excel的效果?(软件选择篇)

在日常的工作中,我们常常会遇到一些财务报表类的图片需要转换成可编辑的excel,但是,受各种条件的限制,常常只能通过手工录入这种原始的方式来实现,随着人工智能、深度学习以及网络技术的发展,这种原始的录入…

一张图,了解美格智能高算力AI模组

美格智能高算力A模组,澎湃算力让AI触手可及!

安徽省广德市选择云轴科技ZStack Cloud云平台建设县级智慧城市

信创是数字中国建设的重要组成部分,也是数字经济发展的关键推动力量。作为云基础软件企业,云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施,ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级,是其中唯一兼容四种…

Pytest模式执行python脚本不生成allure测试报告

1.安装allure 下载allure的zip安装包将allure.zip解压到python的lib目录中将allure的bin路径添加到环境变量path中(注意:配置环境变量后,一定要重启电脑。因为环境变量没生效,我搞了半天在pycharm不能生成报告,在cmd中可以生成报…

Re51:读论文 Language Models as Knowledge Bases?

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:Language Models as Knowledge Bases? ArXiv网址:https://arxiv.org/abs/1909.01066 官方GitHub项目:https://github.com/facebookresearch/LAMA 本文是2019年…

2022-1-25 机器人运动规划方法综述 航空学报

论文PDF abstract 随着应用场景的日益复杂,机器人对旨在生成无碰撞路径(轨迹)的自主运动规划技术的需求也变得更加迫 切。虽然目前已产生了大量适应于不同场景的规划算法,但如何妥善地对现有成果进行归类,并分析不同…

深入解析Java 8中HashMap的底层原理

引言 HashMap是Java中常用的集合类,用于存储键值对。其底层实现经过多次优化,包括哈希算法、数组扩容、链表转红黑树等。本文将深入研究HashMap的底层原理,并详细探讨如何解决哈希碰撞的技术。 1. 哈希算法 HashMap的核心是哈希算法&#…

Webstorm 插件文件目录颜色分析——白蓝绿红黄灰

Webstorm 插件文件目录【白色、蓝色、绿色、红色、黄色、灰色】对应当前文件发生什么了,即文件夹当前状态。 WebStrom配置好git或SVN后文件颜色代表的含义: 白色:本地无修改内容 蓝色:文件内容有修改,暂未提交到git…

从入门到精通!Python数据分析畅销书《利用Python进行数据分析》第三版中文版助你成为数据分析师!

Python数据分析畅销书《利用Python进行数据分析》第三版中文版助你成为数据分析师! 个人简介什么是数据分析如何自学数据分析书籍推荐作译者简介作者简介译者简介 主要变动导读视频:购书链接:参与方式往期赠书回顾 个人简介 🏘️&…

2023上海小学生古诗文大会复赛(复选)在线模拟题库更新到503题

为了帮助参加2023年上海小学生古诗文大会复选(复赛)的孩子们更好地练习和备考,我这几天制作了一个在线练习的模拟题库。 这个在线模拟题对标市级比赛的形式和样式,具有以下特点和功能: 1、可以通过手机、电脑、平板&a…

三十分钟学会Shell(上)

Shell ​ Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,是用户和Linux文件系统之间的桥梁。Shell 有自己的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux&#x…

微信小程序实现类似Vue中的computed、watch功能

微信小程序实现类似Vue中的computed、watch功能 构建npm使用 构建npm 创建包管理器 进入小程序后,打开终端,点击顶部“视图” - “终端” 新建终端 使用 npm init -y初始化包管理器,生成一个package.json文件 安装 npm 包 npm install --…

数字化转型过程中的RPA+X与RPA+B

当前,RPA已成为企业数字转型初始阶段里最受欢迎的自动化解决方案,越来越多的企业开始引入RPA来协助员工,开展各类业务场景的自动化应用。很多企业也都将RPA列为重要流程优化技术,不少公司甚至直接放弃了传统的IT自动化方案&#x…

postman定义公共函数这样写,测试组长直呼牛逼!!!

postman定义公共函数 在postman中,如下面的代码: 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[${name}:实际结果: ${actual} , 期望结果:${expected}]actualexpected…