golang反射自定义tag

Python015

golang反射自定义tag,第1张

维基百科中反射的定义:在计算机科学中,反射是指计算机程序在运行时(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 := 0i <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 := 0i <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

}

```

package dao

import (

_ "code.google.com/p/go-mysql-driver/mysql"

//接口实现,_表示不调用实现,调用接口。

"database/sql"

"fmt"

)

func GetConn() *sql.DB {

//配置数据库连接地址.统一配置.

db, _ := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test")

fmt.Println(db)

return db

}

//使用的时候

db := dao.GetConn()

defer db.Close()

//开始事物

tx, _ := db.Begin()

//查询数据:

// func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error)

select_sql := " SELECT id,user_id,create_date,title FROM post WHERE id = ? "

row := tx.QueryRow(select_sql, id)

//查询userId,创建时间标题信息.

if row != nil {

row.Scan(&Id, &UserId, &CreateDate, &Title)

}

row有排划船路吵闹等意思,那么你知道row的用法吗?下面跟着我一起来学习一下,希望对大家的学习有所帮助!

row的用法:

row的用法1:row的基本意思是“一排,一行”,是可数名词,多与介词of连用,指横向有秩序排成的一行。

row的用法2:row的另一个意思是“划船”“划船游玩”“划船的路程”,一般用单数形式。

row的用法3:row的基本意思是“使成排划船,参加划船比赛”。

row的用法4:row可用作及物动词,也可用作不及物动词。用作及物动词时接名词或代词作宾语。

row的用法5:row后接副词down表示“ (赛船中)赶上”后接副词out表示“使划得精疲力竭”后接副词over表示“一路领先,轻易取胜”row against the wind意思是“逆风而划”。

row的用法6:row用作动词时意思是“争吵,吵闹”,主要用于打架、示威,强调公开化。

row的用法7:row只用作不及物动词,常与about, up, with等介、副词连用。

row的常用 短语 :

用作动词 (v.)

row across1 (v.+adv.)

row across2 (v.+prep.)

row against (v.+prep.)

row down1 (v.+adv.)

row down2 (v.+prep.)

row out (v.+adv.)

row to (v.+prep.)

row up1 (v.+adv.)

row up2 (v.+prep.)

row with one's might

用作名词 (n.)

kick up a row

raise a row

用作动词 (v.)

row about (v.+prep.)

row up (v.+adv.)

row with (v.+prep.)

row的用法例句:

1. We had a humongous row just before she left.

就在她离开之前,我们大吵了一架。

2. After the row in a pub he drove off in a huff.

在酒吧里吵了一架后,他气鼓鼓地开车走了。

3. He finished second in the championship four years in a row.

他连续4年获得锦标赛亚军。

4. He has been on Death Row for 11 years.

他已经在死囚区关了11年。

5. My husband has just had a blazing row with his boss.

我丈夫刚和他老板大吵了一架。

6. This political row threatens to grow into a full blown crisis.

这场政治争端有可能演化成一场全面爆发的危机。

7. "Whatever is that row?" she demanded. "Pop festival," he answered.

“那闹哄哄的究竟是在做什么?”她问道。“是流行音乐节,”他回答说。

8. If I'm inside for three days in a row, I go crazy.

如果连续3天不出来,我会发疯的。

9. She has had a flaming row with her lover.

她刚和恋人发生了激烈的争吵。

10. The ensuing row snarled up the work of the joint peace commission.

随后的争吵把联合和平委员会的工作搅得一团糟。

11. "She's probably had a row with her boyfriend," Charles opined.

“她大概跟男朋友吵架了,”查尔斯说道。

12. Before him, in the first row, sat the President.

在他面前第一排坐着总统。

13. I had a real row with him. I tore into him.

我和他大吵一架,把他狠狠地数落了一顿。

14. A train rocketed by, shaking the walls of the row houses.

一辆火车疾驰而过,排屋的墙都摇晃起来。

15. I had the most almighty row with the waitress.

我和女招待大吵了一架。