go语言序列化数字 golang序列化

Golang中的自定义json序列化后端开发人员跟前端对接接口的时候,或多或少都会面临一些沟通问题,比如说枚举字符的定义 , 比如有整形状态字段: state
通常给前端的时候,前段要做的是将1 , 2,3以及对应的中文释义存储为key/value的形式,key与value单看都无法知道对方的语义,
比如我只知道状态值为“1”,是无法将其与“成功”对应起来的(当然这套状态的设计者肯定是知道的),后端通常给到前端的restful api
接口定义也是key/value的形式,这乍一看其实也没啥毛?。灰衚ey/value也没问题 , 后端定义通常会是
但数字的表现形式终归是不不太明确的,如果对状态的定义换成以下形式:
基本可以理解为中英文互译了,理解起来也会更清晰一些不是,如果这么做的话 , 后端给到前端的响应字段状态的类型就需要修改成字符器格式
后端还是要做一层字符串到整型的转换 , 从目的来讲,我们只是想返给前端的 state 字段是字符串而已,也就是在做json序列化的时候将整型与字符串做一层转换,有更优雅的做法如下所示
只需要做两件事,自定义类型 MyState ,实现 MarshalJSON 方法
只要类型实现了 MarshalJSON 方法,在json序列化时就会调用此方法,如此一来 , 我们就轻松实现了自定义json序列化,反序列化同样如此
实现起来也很简单
需要注意的是, UnmarshalJSON 方法操作过程需要给 receiver 也就是 u 赋值 , 所以必须是指针类型 , 同样的,在实现
MarshalJSON 方法 ,  receiver 的类型需要与结构体定义中的类型保持一致,否则自定义序列化会失败
参考:
golang map[string]string数组编码成json格式,或者序列化,如php的serialize函数;就是将数组变成字符串json.Marshal() 可以将大部分类型的数据转成json格式的,比如map, struct等等
package main
import (
"log"
"fmt"
"encoding/json"
)
【go语言序列化数字 golang序列化】func main() {
v := map[string]string{
"name":"foo",
}
data, err := json.Marshal(v)
if err != nil {
log.Println(err)
return
}
fmt.Println(string(data))
}
Go语言中的字节序Go中的binary包实现了简单的数字与字节序列的转换以及变长值的编解码
package main
import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端顺序存储 LittleEndian小端顺序存储 binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],data[3]) }
输出
[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b
也可以使用下面的方式
n := 0x12345678 var data []byte = make([]byte,4) //操作的都是无符号整型 binary.BigEndian.PutUint32(data,uint32(n))
可以使用下面的方式判断当前系统的字节序类型
const INT_SIZE int = int(unsafe.Sizeof(0))
//判断我们系统中的字节序类型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }
go语言:数组 数组是一个由固定长度的特定类型元素组成的序列go语言序列化数字,一个数组可以由零个或多个元素组成 。数组是值类型
数组的每个元素都可以通过索引下标来访问go语言序列化数字 , 索引下标的范围是从0开始到数组长度减1的位置go语言序列化数字,内置函数 len() 可以返回数组中元素的个数 。

推荐阅读