美文网首页
golang反射自定义tag

golang反射自定义tag

作者: nil_ddea | 来源:发表于2020-11-09 01:04 被阅读0次

维基百科中反射的定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。


golang reflect包实现了反射。动态的获得程序运行时对象的结构和信息。

reflect 包中提供了两个基础的关于反射的函数来获取上述的接口和结构体:

func TypeOf(i interface{}) Type

func ValueOf(i interface{}) Value

大体上可以这样理解,TypeOf获取对象的类型信息,ValueOf获取对象中存储的值。


golang tag

golang中可以为结构体的字段添加tag。golang本身的encoding/json包解析json使用了tag,一些开源的orm框架如gorm,也使用了tag。tag可以方便的为结构体的字段添加一些信息,用reflect可以读取到,加以利用。

这是一个用tag标记列名以实现结构体自动生成xlsx的例子:

```

type Employee struct{

ID int `xlsx:”工号”`

Name string `xlsx:”姓名”`

Email string `xlsx:”邮箱”`

}

func Outputxlsx(es []*Employee) ([]byte, error) {

xt := reflect.TypeOf(es[0])

xv := reflect.ValueOf(es[0])

rows := [][]interface{}{}

headers := []interface{}{}

for i := 0; i < xt.Elem().NumField(); i++ {

head, ok := xt.Elem().Field(i).Tag.Lookup("xlsx")

if ok {

headers = append(headers, head)

}

}

for _, e := range es {

cells := []interface{}{}

xv := reflect.ValueOf(e)

for i := 0; i < xv.Elem().NumField(); i++ {

_, ok := xt.Elem().Field(i).Tag.Lookup("xlsx")

if ok {

cells = append(cells, xv.Elem().Field(i).Interface())

}

}

rows = append(rows, cells)

}

file := xlsx.NewFile()

sheet, _ := file.AddSheet("sheet1")

row := sheet.AddRow()

for _, header := range headers {

row.AddCell().Value = fmt.Sprintf("%v", header)

}

for _, v := range rows {

row := sheet.AddRow()

for _, vv := range v {

row.AddCell().Value = fmt.Sprintf("%v", vv)

}

}

var buffer bytes.Buffer

if err := file.Write(&buffer); err != nil {

return nil, err

}

return buffer.Bytes(), nil

}

```

相关文章

  • golang反射自定义tag

    维基百科中反射的定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态...

  • Golang 反射实现依赖注入

    Golang 反射实现依赖注入 Coding/Golang #Golang #Golang/reflect 依赖注...

  • golang反射用法举例(注册插件)

    有关golang反射的内容,网上有大量讲述,请自行google——"golang反射三法则" 下面主要反射在实际中...

  • 反射 reflection golang

    原文链接:反射reflection-GOLANG

  • Golang 反射

    基本了解 在Go语言中,大多数时候值/类型/函数非常直接,要的话,定义一个。你想要个Struct 你想要一个值,你...

  • golang 反射

    反射机制是指在程序运行的时候动态地获取对象的属性后者调用对象方法的功能。golang 支持反射,原生的 json ...

  • golang反射

    反射让我们能在运行期间弹指对象的类型信息和内存结构,甚至还能访问隐藏属性。 类型 获取对象类型t.Name是真实类...

  • golang 反射

    反射可以获取运行时的数据,在实际编程中,如果我们不清楚输入参数(和输出参数)的类型时,就可以考虑使用反射 Type...

  • [Geth源码]好用到失眠的命令行应用框架cli

    Tag: 以太坊源码 Geth cli Go Golang command line source code 近期...

  • golang 自定义log日志

    golang 自定义log日志

网友评论

      本文标题:golang反射自定义tag

      本文链接:https://www.haomeiwen.com/subject/chikbktx.html