簡體   English   中英

在Go中將結構的字段和不同類型的值寫入文件

[英]Writing a struct's fields and values of different types to a file in Go

我正在編寫一個簡單的程序,該程序從表單接收輸入,使用接收到的數據填充結構的實例,並將接收到的數據寫入文件。

目前,我想出最好的方法來遍歷已填充的結構並將其內容寫入文件中有些卡住。

有問題的結構包含3種不同類型的字段(整數,字符串,[]字符串)。

我可以遍歷它們,但無法獲取它們的實際類型。

通過打印語句檢查我下面發布的代碼,發現它們的每種類型都以結構形式返回,而不是前面提到的字符串,int等。

所需的輸出格式是純文本。

例如:

field_1="value_1"
field_2=10
field_3=["a", "b", "c"]

有人有想法么? 也許我完全是用錯誤的方式來做這件事?

func (c *Config) writeConfigToFile(file *os.File) {

    listVal := reflect.ValueOf(c)
    element := listVal.Elem()

    for i := 0; i < element.NumField(); i++ {
        field := element.Field(i)
        myType := reflect.TypeOf(field)

        if myType.Kind() == reflect.Int {
            file.Write(field.Bytes())
            } else {
                file.WriteString(field.String())
            }
        }
}

為什么不使用內置的gob來存儲您的結構值?

我用它在文件中存儲不同的結構(每行一個)。 在解碼期間,您可以測試類型轉換或在包裝器中提供提示-以給定用例中較快的一種為准。

當回讀該行時,將“編碼”和“解碼”時的每一行都視為緩沖區。 您甚至可以實時gzip / zlib / compress,加密/解密等流。

如果您已經有拋光的和防具磨損的車輪可供使用,則無需重新發明車輪。

可以使用strconv包或fmt來格式化字段,而不是在reflect.Value上使用不起作用的Bytes方法。

這是使用fmt的示例:

var s string
switch fi.Kind() {
case reflect.String:
    s = fmt.Sprintf("%q", fi.String())
case reflect.Int:
    s = fmt.Sprintf("%d", fi.Int())
case reflect.Slice:
    if fi.Type().Elem().Kind() != reflect.String {
        continue
    }

    s = "["
    for j := 0; j < fi.Len(); j++ {
        s = fmt.Sprintf("%s%q, ", s, fi.Index(i).String()) 
    }
    s = strings.TrimRight(s, ", ") + "]"
default:
    continue
}

sf := rv.Type().Field(i)
if _, err := fmt.Fprintf(file, "%s=%s\n", sf.Name, s); err!= nil {
    panic(err)
}

游樂場: https : //play.golang.org/p/KQF3CicVzA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM