繁体   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