csv - 如何动态获取结构中的字段

标签 csv struct go string-concatenation

我有以下结构。我有 csv 方法,它将返回用逗号分隔值连接字符串中的字段。

package main

import (
    "bytes"
    "strconv"
)

type Event struct {
    B_id string
    B_nam string
    B_typ int
    B_uuid string
    B_mj_id int
    B_mi_id int
    B_uid string
    B_url string
    B_mac string
    E_typ string
    E_time string
    C_id string
    D_os string
    D_os_v string
    D_nam string
    D_v string
    Br_nam string
    Br_v string
    A_pkg string
    A_id string
    M_u_id string
    bn_id string
}

func (e *Event) Csv() string {
    var buffer bytes.Buffer
    var comma string = ","

    buffer.WriteString(e.B_id)
    buffer.WriteString(comma)
    buffer.WriteString(e.B_nam)
    buffer.WriteString(comma)
    buffer.WriteString(strconv.Itoa(e.B_typ))
    buffer.WriteString(comma)
    buffer.WriteString(e.B_uuid)
    buffer.WriteString(comma)
    buffer.WriteString(strconv.Itoa(e.B_mj_id))
    buffer.WriteString(comma)
    buffer.WriteString(strconv.Itoa(e.B_mi_id))
    buffer.WriteString(comma)
    buffer.WriteString(e.B_uid)
    buffer.WriteString(comma)
    buffer.WriteString(e.B_url)
    buffer.WriteString(comma)
    buffer.WriteString(e.B_mac)
    buffer.WriteString(comma)
    buffer.WriteString(e.E_typ)
    buffer.WriteString(comma)
    buffer.WriteString(e.E_time)
    buffer.WriteString(comma)
    buffer.WriteString(e.C_id)
    buffer.WriteString(comma)
    buffer.WriteString(e.D_os)
    buffer.WriteString(comma)
    buffer.WriteString(e.D_os_v)
    buffer.WriteString(comma)
    buffer.WriteString(e.D_nam)
    buffer.WriteString(comma)
    buffer.WriteString(e.D_v)
    buffer.WriteString(comma)
    buffer.WriteString(e.Br_nam)
    buffer.WriteString(comma)
    buffer.WriteString(e.Br_v)
    buffer.WriteString(comma)
    buffer.WriteString(e.A_pkg)
    buffer.WriteString(comma)
    buffer.WriteString(e.A_id)
    buffer.WriteString(comma)
    buffer.WriteString(e.M_u_id)
    buffer.WriteString(comma)
    buffer.WriteString(e.bn_id)

    return buffer.String()
}

在这里您可以看到我将每个字段添加到缓冲区中并将其作为字符串返回。这段代码看起来不太好。

是否可以动态获取字段值?类似的东西,

func (e *Event) Csv() string {
    var buffer bytes.Buffer
    var comma string = ","

    var x [22]string fieldValues = //Somehow get the field Values
    for i := 0; i < 22; i++ {
      buffer.WriteString(B_id)
      buffer.WriteString(comma)
    }

    return buffer.String()
}

最佳答案

使用reflect迭代结构字段。

例子如下:

package main

import (
    "fmt"
    "reflect"
    "strings"
)

type Event struct {
    B_id    string
    B_nam   string
    B_typ   string
    B_uuid  string
    B_mj_id string
    B_mi_id string
    B_uid   string
    B_url   string
    B_mac   string
    E_typ   string
    E_time  string
    C_id    string
    D_os    string
    D_os_v  string
    D_nam   string
    D_v     string
    Br_nam  string
    Br_v    string
    A_pkg   string
    A_id    string
    M_u_id  string
    // bn_id   string  //FIXME: unexported fields not work for reflection?
}

func main() {
    // initialize your struct, I only take a few of fields as example.
    e := Event{A_id: "hah", M_u_id: "dadas"}
    v := reflect.ValueOf(e)

    values := make([]string, v.NumField())
    for i := 0; i < v.NumField(); i++ {
        values[i] = v.Field(i).String()
    }

    fmt.Println(strings.Join(values, ","))
}

希望这对您有所帮助。

您可以在线运行它:http://play.golang.org/p/ZheOnMFRnI

关于csv - 如何动态获取结构中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33917278/

相关文章:

go - 从同一文件系统中的不同存储库导入 Go 模块

types - struct{int} 和 struct{int int} 有什么区别?

sql - Powershell : error report while Import CSV file to SQL server

c - c 中不寻常的结构

c - 在编译时查看结构体元素的大小?

c++ - 写入二进制文件时空格过多

python - Pandas - 直接从 URL 读取大型 CSV

python - Pandas read_csv dtype 指定除一列以外的所有列

python - 如何使用 Pandas DataFrame 读取包含图像像素值的 csv 文件

json - 解码 JSON 响应时遇到问题