我正在了解生成器(go generate)并尝试为我的结构体生成验证函数。
我的想法是,我不希望程序在运行时使用反射,而是希望生成器使用反射来生成我想要使用的实际方法。
问题在于我无法在生成器代码中导入我的结构体,目前我找到的唯一方法是从生成器中读取.go文件,并使用正则表达式手动解析其中定义的类型。
我已经得到了类似这样的东西:
models/models.go:
我希望有一个内省包,可以将Go代码作为字符串输入,并提供关于其中定义的结构的一些信息。
或者也许有一种方法可以导入调用go:generate的文件,以直接访问类型。
我的想法是,我不希望程序在运行时使用反射,而是希望生成器使用反射来生成我想要使用的实际方法。
问题在于我无法在生成器代码中导入我的结构体,目前我找到的唯一方法是从生成器中读取.go文件,并使用正则表达式手动解析其中定义的类型。
我已经得到了类似这样的东西:
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的文件,以直接访问类型。
go/parser
、go/ast
和go/token
包?你可以读取文件,对代码进行分词,并用它生成代码。这方面有很多包的示例可供参考。例如,谷歌自己的mockgen。 - Elias Van Ootegemast
包 https://golang.org/pkg/go/ast/ - ssemilla