亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以編程方式填充 golang 結構

以編程方式填充 golang 結構

Go
森欄 2023-07-31 15:39:23
我有一個包含多種類型數據記錄的文件,我需要將其解析為結構。我很高興了解一種按記錄類型填充結構的慣用方法(如果存在)。類似于 python 的namedtuple(*fields)構造函數。package mainimport (    "fmt"    "strconv"    "strings")type X interface{}type HDR struct {    typer, a string    b        int}type BDY struct {    typer, c string    d        int    e        string}var lines string = `HDR~two~5BDY~four~6~five`func sn(s string) int {    i, _ := strconv.Atoi(s)    return i}func main() {    sl := strings.Split(lines, "\n")    for _, l := range sl {        fields := strings.Split(l, "~")        var r X        switch fields[0] {        case "HDR":            r = HDR{fields[0], fields[1], sn(fields[2])} // 1        case "BDY":            r = BDY{fields[0], fields[1], sn(fields[2]), fields[3]} // 2        }        fmt.Printf("%T : %v\n", r, r)    }}我特別感興趣的是了解是否標記了行// 1并// 2可以方便地用代碼替換,也許是某種允許結構本身處理類型轉換的通用解碼器。
查看完整描述

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;應用程序忽略解析整數返回的錯誤;如果數據中的字段多于結構體,應用程序將會出現恐慌;當應用程序遇到不支持的字段類型時,不會報告錯誤;和更多。


在 Go Playground 上運行它



查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號