go语言自定义类型 go语言自定义类型JSON( 二 )


只需要做两件事,自定义类型 MyState ,实现 MarshalJSON 方法
只要类型实现了 MarshalJSON 方法 , 在json序列化时就会调用此方法,如此一来,我们就轻松实现了自定义json序列化 , 反序列化同样如此
实现起来也很简单
需要注意的是,UnmarshalJSON 方法操作过程需要给 receiver 也就是 u 赋值,所以必须是指针类型,同样的 , 在实现
MarshalJSON 方法,receiver 的类型需要与结构体定义中的类型保持一致,否则自定义序列化会失败
参考:
go语言中 int8是什么类型C语言中变量的声明/定义格式如下:存储类型类型修饰符数据类型变量名;存储类型:用来指明变量的存储位置,即运行该变量在哪一段分配内存空间,常见的存储位置有auto、extern、register、static,在一段执行程序中,可以为变量分配存储空间的有BSS、数据区、栈区、堆区 。类型修饰符:用来修饰变量的存储和表现方式 。包括long、short、signed、unsigned、void、const、volatile等 。数据类型:用来指明该变量的存储大?。?即一个该类型的变量要占用多少内存空间 。基本数据类型有(char、int、float、指针类型)和由基本数据类型组成的用户自定义类型(struct、enum、typedef、union)
golang类型字面量类型字面量又被称作“未命名类型”
基本上除自定义类型、预定义类型外都是类型字面量 。
以下都是类型字面量:
golang类型系统总览
欢迎加v交流:maxwangnan005
golang反射自定义tag维基百科中反射的定义:在计算机科学中,反射是指计算机程序在运行时(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; ixt.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; ixv.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 = https://www.04ip.com/post/fmt.Sprintf("%v", header)
}
for _, v := range rows {
row := sheet.AddRow()
for _, vv := range v {
row.AddCell().Value = https://www.04ip.com/post/fmt.Sprintf("%v", vv)
}
}

推荐阅读