go generate命令其實就是用來生成代碼用的,一般情況下需要配置其他工具和庫一起使用
go官網有個實例:
painkiller.go
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
Paracetamol
Acetaminophen = Paracetamol
)
假設我們現在需要為painkiller.go 中的常量添加String方法,我們可以這樣寫
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 來自動化生成代碼呢?
在 painkiller.go 最開頭處添加
//go:generate stringer -type=Pill
因為要用到工具stringer,所以我們通過命令安裝
go get golang.org/x/tools/cmd/stringer
然后在painkiller目錄執行go generate,會生成一個pill_string.go的文件:
// Code generated by "stringer -type=Pill"; DO NOT EDIT.
package painkiller
import "strconv"
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]]
}