打赏

go generate用法

go generate用法

1.generate命令

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

//添加注释
//go:generate command argument...   //注意:双斜线之后没有空格

2.使用 go generate 工具编译 protobuf

//go:generate protoc --go_out=. *.proto

package test
 或者

//go:generate sh -c "protoc --go_out=. *.proto"

package test

说明:这里stringer需要手动安装
 go get golang.org/x/tools/cmd/stringer

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

3.自动生成 Stringer 接口

package painkiller

type Pill int

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

func (p Pill) String() string {
    switch p {
    case Placebo:
        return "Placebo"
    case Aspirin:
        return "Aspirin"
    case Ibuprofen:
        return "Ibuprofen"
    case Paracetamol: // == Acetaminophen
        return "Paracetamol"
    }
    return fmt.Sprintf("Pill(%d)", p)
}

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

package painkiller

type Pill int

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

==============================================
// 自动生成 pill_string.go

// generated by stringer -type Pill pill.go; DO NOT EDIT

package painkiller

import "fmt"

const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

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

func (i Pill) String() string {
    if i < 0 || i+1 >= Pill(len(_Pill_index)) {
        return fmt.Sprintf("Pill(%d)", i)
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}

4.Error错误的处理

(1.)传统的错误处理,通过map返回

package errcode

import "fmt"

// 定义错误码
const (
    ERR_CODE_OK = 0 // OK
    ERR_CODE_INVALID_PARAMS = 1 // 无效参数
    ERR_CODE_TIMEOUT = 2 // 超时
    // ...
)

// 定义错误码与描述信息的映射
var mapErrDesc = map[int]string {
    ERR_CODE_OK: "OK",
    ERR_CODE_INVALID_PARAMS: "无效参数",
    ERR_CODE_TIMEOUT: "超时",
    // ...
}

// 根据错误码返回描述信息
func GetDescription(errCode int) string {
    if desc, exist := mapErrDesc[errCode]; exist {
        return desc
    }
    
    return fmt.Sprintf("error code: %d", errCode)
}

(2.)使用string()方法实现

// ErrCode used to define response code
type ErrCode uint32

//go:generate stringer -type ErrCode -output code_string.go
或者//go:generate stringer -type ErrCode -linecomment -output code_string.go
const (
    ERR_CODE_OK ErrCode = 0 // OK
    ERR_CODE_INVALID_PARAMS ErrCode = 1 // 无效参数
    ERR_CODE_TIMEOUT ErrCode = 2 // 超时
)


//注意:执行go generate 会在同一个目录下生成一个文件errcode_string.go
func (i ErrCode) String() string {
   // xxx
}

//为了防止忘记手动generate,可以写到makefile中
all:
    go generate && go build .

go-swag:
	swag init --parseVendor -g ./main.go

5.其他用法

package main

import "fmt"

//go:generate echo GoGoGo!
//go:generate go run main.go
//go:generate echo $GOARCH $GOOS $GOFILE $GOLINE $GOPACKAGE

func main() {
 fmt.Println("go rum main.go!")
}

相关链接

http://c.biancheng.net/view/4442.html
https://www.xiaoheidiannao.com/70045.html
https://juejin.cn/post/6844903923166216200
https://islishude.github.io/blog/2019/01/23/golang/go-generate-预处理器教程/

posted @ 2021-04-16 09:16  苍山落暮  阅读(1231)  评论(0编辑  收藏  举报