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

我有以下结构。我有方法 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()

}

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

炎炎设计
浏览 157回答 1
1回答

神不在的星期二

使用reflect来迭代结构字段。这是示例:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "reflect"&nbsp; &nbsp; "strings")type Event struct {&nbsp; &nbsp; B_id&nbsp; &nbsp; string&nbsp; &nbsp; B_nam&nbsp; &nbsp;string&nbsp; &nbsp; B_typ&nbsp; &nbsp;string&nbsp; &nbsp; B_uuid&nbsp; string&nbsp; &nbsp; B_mj_id string&nbsp; &nbsp; B_mi_id string&nbsp; &nbsp; B_uid&nbsp; &nbsp;string&nbsp; &nbsp; B_url&nbsp; &nbsp;string&nbsp; &nbsp; B_mac&nbsp; &nbsp;string&nbsp; &nbsp; E_typ&nbsp; &nbsp;string&nbsp; &nbsp; E_time&nbsp; string&nbsp; &nbsp; C_id&nbsp; &nbsp; string&nbsp; &nbsp; D_os&nbsp; &nbsp; string&nbsp; &nbsp; D_os_v&nbsp; string&nbsp; &nbsp; D_nam&nbsp; &nbsp;string&nbsp; &nbsp; D_v&nbsp; &nbsp; &nbsp;string&nbsp; &nbsp; Br_nam&nbsp; string&nbsp; &nbsp; Br_v&nbsp; &nbsp; string&nbsp; &nbsp; A_pkg&nbsp; &nbsp;string&nbsp; &nbsp; A_id&nbsp; &nbsp; string&nbsp; &nbsp; M_u_id&nbsp; string&nbsp; &nbsp; // bn_id&nbsp; &nbsp;string&nbsp; //FIXME: unexported fields not work for reflection?}func main() {&nbsp; &nbsp; // initialize your struct, I only take a few of fields as example.&nbsp; &nbsp; e := Event{A_id: "hah", M_u_id: "dadas"}&nbsp; &nbsp; v := reflect.ValueOf(e)&nbsp; &nbsp; values := make([]string, v.NumField())&nbsp; &nbsp; for i := 0; i < v.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; values[i] = v.Field(i).String()&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(strings.Join(values, ","))}可能这会有所帮助。你可以在线运行:http : //play.golang.org/p/ZheOnMFRnI
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go