go generator & linkname

658 阅读1分钟

这两个命令,如果有人看过源码,或者看过别人写的代码的时候会很吃惊这个是什么,其实这里我也就记一下,因为怕以后想用可以回来找找

go generator

这里有个文档比较不错 : docs.google.com/document/d/…

其次就是这个玩意听着名字其实就是 生成器吗,却是就是生成器,就是go文件可以执行脚本。

背景: 比如说我们当前的目录有protobuf文件,那么如果去build呢,写个shell脚本,显然是不对的,因为目前对于protobuf文件的维护是不允许仓库中存放编译好的代码的,也就是线上进行编译,防止版本不一致。

.
├── build.go
└── echoservice.proto

如何做呢? 我的build.go 会记录一些build脚本,也就是可以帮助生成protobuf编译后的文件

package service

//go:generate protoc --go_out=plugins=micro:. echoservice.proto

此时如果你用的 goland,那么一定会提示可以直接运行,那你就运行就行了

关于命令行如何运行

 go generate build.go

所以确实是很方便

go linkname

这个玩意其实就是个动态引用

​ 大白话的讲讲linkname的作用吧,比如我们申明了一个a方法,我们目前没有实现,那么有些同学会说申明个接口,空方法,那就等于目前阶段没有完成。

import (
	_ "github.com/anthony-dong/go-commons/linkname/api"
)
func World() // 这种写法一定是错误的,一定报错 ,需要在包文件里申明一个一个.s文件
import (
	"fmt"
	_ "unsafe" // 必须引用
)

func init()  {
	fmt.Println("init")
}

// 格式就是 funcname , 包名字
//go:linkname Hello github.com/anthony-dong/go-commons/linkname/outor.World
func Hello() {
	println("hello,world!")
}

然后就可以使用word 方法了,就是这么简单。(需要在 world方法的包下面放入一个空的.a文件)