我正在发现生成器(开始生成),并且试图为我的结构生成Validation函数。
我的想法是我不希望我的程序在运行时使用反射,而是希望生成器使用反射来生成我要使用的实际方法。
问题是我无法在生成器代码中导入我的结构,到目前为止,我发现的唯一方法是从生成器读取.go文件并使用regex手动解析在那里定义的类型
我有类似
models / models.go:
package models
//go:generate go run ../generator.go -file models.go
type MyStruct struct {
...
}
generator.go:
package main
func main() {
f, err := ioutil.ReadFile(fileName) // I read filename from the flag provided
...
// I parse f to generate my stuff
}
我非常希望有一个自省软件包,该软件包将go代码作为字符串,并提供一些有关在那里定义的结构的信息
或者也许有一种方法可以导入调用go:generate的文件来直接访问类型
答案 0 :(得分:1)
无需指定文件名,此代码具有相同的作用:
//go:generate go run ../generator.go -file $GOFILE
借助文本/模板包,您无需解析文件。一个非常简单的例子就是这样。这将为您提供线索:
package main
import (
"flag"
"os"
"text/template"
)
//go:generate go run main.go -name=A
//go:generate go run main.go -name=B
//go:generate go run main.go -name=C
var name = flag.String("name", "test", "name of struct")
var code = `
package main
type Struct{{.}} struct {}
func (s *Struct{{.}} ) Vailadte() bool {
return true
}
`
func main() {
flag.Parse()
file, _ := os.Create(*name + ".go")
defer file.Close()
tmpl, _ := template.New("test").Parse(code)
tmpl.Execute(file, *name)
}