首页 文章

将结构的字段和不同类型的值写入Go中的文件

提问于
浏览
0

我正在编写一个简单的程序,它从表单中获取输入,用接收到的数据填充结构的实例,并将接收到的数据写入文件 .

我现在有点陷入困境,想出了迭代填充结构并将其内容写入文件的最佳方法 .

有问题的结构包含3种不同类型的字段(整数,字符串,[]字符串) .

我可以迭代它们但我无法得到它们的实际类型 .

使用print语句检查下面发布的代码,发现它们的每个类型都以结构形式返回,而不是前面提到的字符串,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())
            }
        }
}

2 回答

  • 2

    您可以使用 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

  • 2

    为什么不使用built-in gob package存储结构值?

    我用它来存储不同的结构,每行一个,在文件中 . 在解码过程中,您可以测试类型转换或在包装器中提供提示 - 以您的给定用例更快的速度为准 .

    在读取行时,您可以在编码和解码时将每一行视为缓冲区 . 您甚至可以实时gzip / zlib / compress,加密/解密等流 .

    当您拥有抛光和装甲轮时,没有必要重新发明轮子 .

相关问题