doubo1711 2015-11-25 13:06
浏览 53
已采纳

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

I have the below struct. I have the method csv which will return concatenate the fields in a string with comma separated value.

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()
}

Here you can see that I adding each fields in a buffer and returning it as a string. This code does not looks nice.

Is it possible to get the field value dynamically? Something like,

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()
}
  • 写回答

1条回答 默认 最新

  • dongxinpa3101 2015-11-25 13:26
    关注

    Use reflect to iterate the struct fields.

    Here is the example:

    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, ","))
    }
    

    May this be helpful.

    You can run it online: http://play.golang.org/p/ZheOnMFRnI

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启