推进需求

GO 项目,可整体生成一个运行文件到处跑,是极爽之事。但如果有资源文件要得带着跑,则破坏了这种体验。

例如下边这个项目结构,resource 目录下为资源文件,main.go 中会通过路径引用到这些资源文件,于是新的需求产生了。

|- hello

----|- resource

---------|- note.txt

----|- main.go

需求推进一步:将资源文件打包至运行文件中,在代码中仍然使用类似相对路径的引用方式使用它(这个很重要,使用在概念上保持一致)。

解决方案跟上:把资源文件数据转换成 GO 代码中的变量值存储,并提供函数可根据路径差数返回相应的数据。这样一来资源文件就变成了代码文件,又可以一个运行文件到处跑了。

工具跟进 go-bindata

于是,工具 go-bindata 就来了,它来完成将资源文件变成 GO 代码的工作。

go get -u github.com/jteeuwen/go-bindata/...
go install

在 hello 项目目录下执行这个工具,就会生成 -o 指定的 bindata.go 代码文件。

go-bindata -pkg main -o bindata.go resource/

此时,在 hello 目录下就多了 bindata.go 代码文件,然后,在 main.go 中,就可以使用以下方式指定相对路径参数来取得资源数据。

bs, _ := Asset("resource/note.txt")

生成代码机制 go generate

有了上述工具,当 note.txt 数据有更新时,就需要使用 go-bindata 工具重新生成代码文件再编译,可不可以形成一种专门的机制来规范化这类动作呢?

于是,再进一步,若能如此甚好:

(1)GO 项目的代码中,能自描述的表明有些相关依赖代码由需要由工具产生。

(2)支持简单的方式来完成自描述所表明的操作动作。

于是,go generate 应运而生,来看一下它的大概描述。

go generate 命令是 go 1.4 版新添加的一个命令,它将扫描与当前包相关的源代码文件,找出所有包含 "//go:generate" 的特殊注释,提取并执行该特殊注释后面的命令,命令为可执行程序。

是不是完美的实现了上述两项诉求。

(1)在源代码,即 GO 文件中,进行注释(自描述)即可指定要执行的工具命令。

除了 go-bindata 工具之外,类似的工具定是还有很多。工具抽象出来可认为就是可执行命令,指定命令甚是灵活。

(2)只要执行一条命令,即可自动扫描当前包相关的源代码文件来完成相应的执行。

这说明,不论有多少个这样的命令需要执行,它会负责找到并执行。

小小实例,一目了然

开头项目结构中,main.go 的完整代码如下:

//go:generate go-bindata -pkg main -o bindata.go resource/
//go:generate go build
//go:generate hello package main import (
"fmt"
) func main() {
bs, _ := Asset("resource/note.txt")
fmt.Println(string(bs))
}

注释部分即描述了三个动作,完成资源文件代码生成,编译与运行命令,当执行 go generate 时,三条命令执行下来运行的结果为显示 note.txt 中的文本内容。运行效果如下,当修改了 note.txt,执行 go generate,会自动完成重新生成代码,编译和运行。

GO代码生成代码小思小试的更多相关文章

  1. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  2. 发布代码小助手V2.1发布了——Code2HTML工具

    设计起源: 新浪博客似乎没有插入代码的功能,所以不得不用打空格的方法格式化代码.而且没法显示行号. 描述: 发布代码小助手用python和Tkinter开发,可以在任何常见操作系统上运行.主要用于在不 ...

  3. 一套代码小程序&Web&Native运行的探索07——mpvue简单调研

    前言 接上文:[一套代码小程序&Native&Web阶段总结篇]可以这样阅读Vue源码 最近工作比较忙,加之上个月生了小孩,小情人是各种折腾他爸妈,我们可以使用的独立时间片不多,虽然这 ...

  4. 【一套代码小程序&Native&Web阶段总结篇】可以这样阅读Vue源码

    前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一 ...

  5. 一套代码小程序&Web&Native运行的探索06——组件系统

    接上文:一套代码小程序&Web&Native运行的探索05——snabbdom 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tre ...

  6. 一套代码小程序&Web&Native运行的探索05——snabbdom

    接上文:一套代码小程序&Web&Native运行的探索04——数据更新 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/ma ...

  7. 一套代码小程序&Web&Native运行的探索04——数据更新

    接上文:一套代码小程序&Web&Native运行的探索03 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

  8. 一套代码小程序&Web&Native运行的探索03——处理模板及属性

    接上文:一套代码小程序&Web&Native运行的探索02 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

  9. 一套代码小程序&Web&Native运行的探索02

    接上文:一套代码小程序&Web&Native运行的探索01,本文都是一些探索性为目的的研究学习,在最终版输出前,内中的内容可能会有点乱 参考: https://github.com/f ...

随机推荐

  1. 正定矩阵(definite matrix)

    1. 基本定义 在线性规划中,一个对称的 n×n 的实值矩阵 M,如果满足对于任意的非零列向量 z,都有 zTMz>0. 更一般地,对于 n×n 的 Hermitian 矩阵(原矩阵=共轭转置, ...

  2. Jenkins build失败条件

    在Jenkins 项目写了很多剧本.有时候,我发现脚本失败,但Jenkins运行成功. Jenkins无论是通过退出代码0比量build成功. 因此,newLISP在.您可以使用(exit)对于成功. ...

  3. WPF 4 单词拼写检查(SpellCheck)

    原文:WPF 4 单词拼写检查(SpellCheck)      在WPF中 Textbox 和RichTextBox 控件都内置了拼写检查属性,但该属性目前默认仅支持English.Spanish. ...

  4. jquery腾讯微博

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. WPF的逻辑树和视觉树

    原文:WPF的逻辑树和视觉树 这部分的内容来自于即将出版的新书<WPF Unleashed>的第三章样章.关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子: <Window ...

  6. 如何在XAML中转义大括号

    原文:如何在XAML中转义大括号 如何在XAML中转义大括号                                       周银辉 我们知道大括号"{}"在XAML中 ...

  7. java中==和equels的区别

    起初接触java的时候这个问题还是比较迷茫的,最近上班之余刷博客的时候看了一些大神写的文章,自己也来总结一下,直接贴代码: package string; public class demo1 { p ...

  8. WPF 在一个dll创建一个Window(包含xaml),在另一个dll中再次继承 会出错

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/e92390eb-bbfa-42fb-baa9-2286444c0dca/the-comp ...

  9. C#命名约定

    推荐的标识命名风格 风格名称 描述 使用建议 示例 Pascal大小写 标识符中每个单词都首字母大写 用于类型名和成员名 CarDeck, DealersHand Camel大小写 除第一个单词以外, ...

  10. 至于Nim和Crystal这类语言最大的用途,就是活在脑残粉的理想里(发人警醒)

    lisp,haskell 有很多人在用,而且是编程经验在 10 年以上,包括 Rust 的作者.Nim 的作者.因此,你不知道有人用,那是因为你的开发阅历太低. 人工智能这个领域从来没有脱离 lisp ...