gpt4 book ai didi

pointers - 反射结构字段。使用标志指针值设置

转载 作者:行者123 更新时间:2023-12-01 21:09:32 25 4
gpt4 key购买 nike

我解析了一堆标志,然后尝试将这些值分配给结构中的字段,但是我很难将解析的标志值设置到结构中,因为我无法键入断言或强制转换它.
这是我拥有的代码片段。过分担心 IterFields 并不重要。函数,基本上是为结构中的每个字段调用第三个参数...

Note: there are comments in the code below which highlight the error(s).


    flag.Parse()

IterFields(st, v, func(field reflect.Value, sf reflect.StructField) {
flag.VisitAll(func(f *flag.Flag) {
if f.Name == strings.ToLower(sf.Name) || f.Name == sf.Tag.Get("short") {
fmt.Printf("%+v, %T\n", f.Value, f.Value)
// PRINTS: true, *flag.boolValue

if v, ok := f.Value.(bool); ok {
fmt.Println("ok")
} else {
fmt.Println("not ok")
}
// ERROR: impossible type assertion: bool does not implement flag.Value (missing Set method)

field.Set(reflect.ValueOf(f.Value))
// PANIC: value of type *flag.boolValue is not assignable to type bool
}
})
})

最佳答案

f.Value是一个接口(interface)类型 flag.Value 抽象各种标志值。正如您的代码所示,它不是 bool 类型但有些非导出*flag.boolValue .你不应该关心它的动态类型。
您可以使用 Value.String()获取其值为 string 的方法, 这将是 "false""true"对于 bool 类型,您可以使用简单的比较来获得 bool从它喜欢f.Value.String() == "true" .
但更好的方法是:全部 flag.Value源自 flag 的值包还实现 flag.Getter 其中还有一个 Get()直接返回 bool 的方法 bool 标志的值(当然包含在 interface{} 中)。只需使用它:

field.Set(reflect.ValueOf(f.Value.(flag.Getter).Get()))
以上适用于任何类型的字段(假设标志的值类型可分配给字段的类型)。
对于 bool仅限字段,或者您也可以使用:
field.SetBool(f.Value.(flag.Getter).Get().(bool))

关于pointers - 反射结构字段。使用标志指针值设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63360273/

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