在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中文網其他相關文章!