13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

创新互联GO教程:gogenerate命令——在编译前自动化生成某类代码

go generate命令是在Go语言 1.4 版本里面新添加的一个命令,当运行该命令时,它将扫描与当前包相关的源代码文件,找出所有包含
//go:generate的特殊注释,提取并执行该特殊注释后面的命令。

成都创新互联公司是一家专业从事网站建设、网络营销、成都小程序开发、网站运营为一体的建站企业;在网站建设告别千篇一律,告别似曾相识,这一次我们重新定义网站建设,让您的网站别具一格。响应式网站设计,实现全网营销!一站适应多终端,一样的建站,不一样的体验!

使用
go generate命令时有以下几点需要注意:

在下面这些场景下,我们会使用
go generate命令:

再比如:


go generate命令格式如下所示:

go generate [-run regexp] [-n] [-v] [-x] [command] [build flags] [file.go... | packages]

参数说明如下:

执行
go generate命令时,也可以使用一些环境变量,如下所示:

【示例 1】假设我们有一个 main.go 文件,内容如下:

package main

import "fmt"

//go:generate go run main.go
//go:generate go version
func main() {
    fmt.Println("http://c.biancheng.net/golang/")
}

执行
go generate -x命令,输出结果如下:

go generate -x
go run main.go
http://c.biancheng.net/golang/
go version
go version go1.13.6 windows/amd64

通过运行结果可以看出
//go:generate之后的命令成功运行了,命令中使用的
-x参数是为了将执行的具体命令同时打印出来。

下面通过 stringer 工具来演示一下
go generate命令的使用。

stringer 并不是Go语言自带的工具,需要手动安装。我们可以通过下面的命令来安装 stringer 工具。

go get golang.org/x/tools/cmd/stringer

上面的命令需要翻墙。条件不允许的话也可以通过 Github 上的镜像来安装,安装方法如下:

git clone https://github.com/golang/tools/ $GOPATH/src/golang.org/x/tools
go install golang.org/x/tools/cmd/stringer

安装好的 stringer 工具位于 GOPATH/bin 目录下,想要正常使用它,需要先将 GOPATH/bin 目录添加到系统的环境变量 PATH 中。

【示例 2】使用 stringer 工具实现 String() 方法:

首先,在项目目录下新建一个 painkiller 文件夹,并在该文件夹中创建 painkiller.go 文件,文件内容如下:

//go:generate stringer -type=Pill
package painkiller

type Pill int

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

然后,在 painkiller.go 文件所在的目录下运行
go generate命令。

执行成功后没有任何提示信息,但会在当前目录下面生成一个 pill_string.go 文件,文件中实现了我们需要的 String() 方法,文件内容如下:

// Code generated by "stringer -type=Pill"; DO NOT EDIT.

package painkiller

import "strconv"

func _() {
    // An "invalid array index" compiler error signifies that the constant values have changed.
    // Re-run the stringer command to generate them again.
    var x [1]struct{}
    _ = x[Placebo-0]
    _ = x[Aspirin-1]
    _ = x[Ibuprofen-2]
    _ = x[Paracetamol-3]
}

const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

var _Pill_index = [...]uint8{0, 7, 14, 23, 34}

func (i Pill) String() string {
    if i < 0 || i >= Pill(len(_Pill_index)-1) {
        return "Pill(" + strconv.FormatInt(int64(i), 10) + ")"
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}

文章题目:创新互联GO教程:gogenerate命令——在编译前自动化生成某类代码
文章网址:http://cdbrznjsb.com/article/cdogpgs.html

其他资讯

让你的专属顾问为你服务