我刚开始学习Go,就遇到了这个问题。我正在制作一个 YAML 解析器来填充结构,然后替换默认值。
import (
"os"
"github.com/creasty/defaults"
"gopkg.in/yaml.v3"
)
type ConfigSchema struct {
Metadata MetadataSchema `yaml:"metadata"`
Fields []FieldSchema `yaml:"fields"`
}
type MetadataSchema struct {
Name string `yaml:"name"`
}
type FieldSchema struct {
Settings FieldSettingsSchema `yaml:"settings"`
Value string `yaml:"value"`
}
type FieldSettingsSchema struct {
Description string `yaml:"description"`
Enabled bool `yaml:"enabled" default:"true"`
}
func main() {
yamlPath := "C:/path/test.yml"
var configSchema ConfigSchema
_ = parse(yamlPath, configSchema)
}
func parse(filePath string, out interface{}) error {
fileContent, err := os.ReadFile(filePath)
if err != nil {
return err
}
err = yaml.Unmarshal(fileContent, &out)
if err != nil {
return err
}
err = defaults.Set(out) // <- "not a struct pointer"
if err != nil {
panic(err)
}
return nil
}
文件解析正确,但由于某种原因,在填写空值时出现错误not a struct pointer
。你能告诉我如何修复它吗?
我想也许我还应该指出 中的链接defaults.Set(&out)
,但错误仍然存在。
另一种选择是将初始化放在var configSchema ConfigSchema
函数中parse
并返回(ConfigSchema, err)
。在这种情况下,一切正常,但有一个特定结构的绑定,但我想实现一个更通用的解析器。