通过阅读.go文件来反思结构类型

时间:2018-12-14 15:50:36

标签: go reflection code-generation introspection

我正在发现生成器(开始生成),并且试图为我的结构生成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的文件来直接访问类型

1 个答案:

答案 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)
}