gpt4 book ai didi

go - 通过读取 .go 文件来反射(reflection)结构类型

转载 作者:IT王子 更新时间:2023-10-29 01:11:59 26 4
gpt4 key购买 nike

我正在探索生成器 (go generate) 并尝试为我的结构生成验证函数。

我的想法是我不希望我的程序在运行时使用反射,我宁愿让生成器使用反射来生成我想要使用的实际方法。

问题是我无法在生成器代码中导入我的结构,到目前为止我发现的唯一方法是从生成器读取 .go 文件并使用正则表达式手动解析那里定义的类型

我有类似的东西

模型/模型.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
}

我非常希望有一个内省(introspection)包,它将一个 go 代码作为一个字符串,并给我一些关于在那里定义的结构的信息

或者也许有一种方法可以导入调用 go:generate 的文件以直接访问类型

最佳答案

不需要指定文件名,这段代码也是一样的:

//go:generate go run ../generator.go -file $GOFILE

在 text/template 包的帮助下,您无需解析文件。一个非常简单的例子就是这样。这会给你线索:

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

关于go - 通过读取 .go 文件来反射(reflection)结构类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53782952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com