• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

gogenerate用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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-预处理器教程/


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
gojwtOAuth2.0发布时间:2022-07-10
下一篇:
Go:二分查找发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap