1 回答

TA貢獻1827條經驗 獲得超8個贊
使用Reflect包以編程方式設置字段。
必須導出一個字段才能由反射包設置。通過將名稱中的第一個符文大寫來導出名稱:
type HDR struct {
? ? Typer, A string
? ? B? ? ? ? int
}
type BDY struct {
? ? Typer, C string
? ? D? ? ? ? int
? ? E? ? ? ? string
}
創建名稱到與名稱關聯的類型的映射:
var types = map[string]reflect.Type{
? ? "HDR": reflect.TypeOf((*HDR)(nil)).Elem(),
? ? "BDY": reflect.TypeOf((*BDY)(nil)).Elem(),
}
對于每一行,使用映射創建一個類型的值types:
for _, l := range strings.Split(lines, "\n") {
? ? fields := strings.Split(l, "~")
? ? t := types[fields[0]]
? ? v := reflect.New(t).Elem()
? ? ...
}
循環遍歷該行中的字段。獲取字段值,將字符串轉換為字段值的種類并設置字段值:
? ? for i, f := range fields {
? ? ? ? fv := v.Field(i)
? ? ? ? switch fv.Type().Kind() {
? ? ? ? case reflect.String:
? ? ? ? ? ? fv.SetString(f)
? ? ? ? case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
? ? ? ? ? ? n, _ := strconv.ParseInt(f, 10, fv.Type().Bits())
? ? ? ? ? ? fv.SetInt(n)
? ? ? ? }
? ? }
這是該方法的基本輪廓。錯誤處理值得注意:如果類型名稱不是中提到的類型之一,應用程序將出現恐慌types;應用程序忽略解析整數返回的錯誤;如果數據中的字段多于結構體,應用程序將會出現恐慌;當應用程序遇到不支持的字段類型時,不會報告錯誤;和更多。
- 1 回答
- 0 關注
- 179 瀏覽
添加回答
舉報