在 Go 中动态设置结构体属性
在给定的代码示例中,需要根据读取的值动态更新结构体的属性一个文件。不要手动检查每个属性名称并设置它,而是考虑利用强大的反射包。
反射包允许动态访问结构体的属性及其值。下面介绍如何实现动态属性设置:
1.创建辅助函数:
import ( "fmt" "errors" "reflect" ) // setField sets field of v with given name to given value. func setField(v interface{}, name string, value string) error { // v must be a pointer to a struct rv := reflect.ValueOf(v) if rv.Kind() != reflect.Ptr || rv.Elem().Kind() != reflect.Struct { return errors.New("v must be pointer to struct") } // Dereference pointer rv = rv.Elem() // Lookup field by name fv := rv.FieldByName(name) if !fv.IsValid() { return fmt.Errorf("not a field name: %s", name) } // Field must be exported if !fv.CanSet() { return fmt.Errorf("cannot set field %s", name) } // We expect a string field if fv.Kind() != reflect.String { return fmt.Errorf("%s is not a string field", name) } // Set the value fv.SetString(value) return nil }
2.用法:
var config SshConfig ... err := setField(&config, split[0], strings.Join(split[1:], " ")) if err != nil { // handle error }
此动态属性设置使您可以轻松更新结构体属性,而无需硬编码属性名称。
以上是如何使用反射动态设置 Go 中的结构体属性?的详细内容。更多信息请关注PHP中文网其他相关文章!