Go?easyjson使用及反射原理
如果使用go語(yǔ)言自帶的json庫(kù),使用的是反射,而go語(yǔ)言中反射性能較低。easyjson就是一個(gè)比較好的替代方案。
esayjson安裝(https://gitcode.net/mirrors/mailru/easyjson?utm_source=csdn_github_accelerator)
go get -u github.com/mailru/easyjson go install github.com/mailru/easyjson/easyjsonorgo go build -o easyjson github.com/mailru/easyjson/easyjson(這里默認(rèn)在當(dāng)前目錄生成easyjson二進(jìn)制可執(zhí)行文件)
安裝easyjson
# for Go < 1.17 go get -u github.com/mailru/easyjson/... # for Go >= 1.17 go get github.com/mailru/easyjson && go install github.com/mailru/easyjson/...@latest
說(shuō)下我的環(huán)境:win10,go1.18,如下圖

安裝完畢后,GOPATH里bin下就有easyjson.exe。
使用go env 查看如我的gopath為:C:\Users\77293\go

使用easyjson
go mod init demo
比如我的當(dāng)前工作目錄demo下初始化mod,創(chuàng)建一個(gè)文件夾model,在model下新建student.go文件:
定義結(jié)構(gòu)體:
記得在需要使用easyjson的結(jié)構(gòu)體上加上//model:json 標(biāo)注。 此處model是我的包路徑名即為model,代碼如下:
package model
import "time"
//model:json
type School struct {
Name string `json:"name"`
Addr string `json:"addr"`
}
type Student struct {
Id int `json:"id"`
Name string `json:"s_name"`
School School `json:"s_chool"`
Birthday time.Time `json:"birthday"`可以進(jìn)入結(jié)構(gòu)體包model下執(zhí)行:
easyjson -all student.go
運(yùn)行完后,該文件夾中有一個(gè)student_easyjson.go,該文件中就是easyjson幫我們生成的MarshalJSON和UnmarshalJSON方法.

使用示例
package main
import (
"demo/model"
"fmt"
"time"
)
func main() {
s := model.Student{
Id: 11,
Name: "qq",
School: model.School{
Name: "CUMT",
Addr: "xz",
},
Birthday: time.Now(),
}
bt, err := s.MarshalJSON() // MarshalJSON
fmt.Println(string(bt), err)
json := `{"id":1,"s_name":"克萊爾","s_chool":{"name":"中南","addr":"wuhan"},"birthday":"2003-08-04T20:58:07.9894603+08:00"}`
str := model.Student{}
str.UnmarshalJSON([]byte(json)) // UnmarshalJSON
fmt.Println(str)
}運(yùn)行結(jié)果:
{"id":11,"s_name":"qq","s_chool":{"name":"CUMT","addr":"xz"},"birthday":"2022-04-17T20:48:07.9274949+08:00"} <nil>
{1 克萊爾 {中南 wuhan} 2003-08-04 20:58:07.9894603 +0800 CST
小結(jié):go自帶JSON庫(kù)使用的反射原理,性能相對(duì)較差,可以使用easyjson代替。
到此這篇關(guān)于Go easyjson使用技巧的文章就介紹到這了,更多相關(guān)Go easyjson使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- go語(yǔ)言通過(guò)反射獲取和設(shè)置結(jié)構(gòu)體字段值的方法
- 淺談Go語(yǔ)言中的結(jié)構(gòu)體struct & 接口Interface & 反射
- 圖文詳解go語(yǔ)言反射實(shí)現(xiàn)原理
- golang通過(guò)反射設(shè)置結(jié)構(gòu)體變量的值
- golang 如何用反射reflect操作結(jié)構(gòu)體
- go語(yǔ)言通過(guò)反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對(duì)應(yīng)的操作
- Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法
- Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析
相關(guān)文章
go?sync.Once實(shí)現(xiàn)高效單例模式詳解
這篇文章主要為大家介紹了go?sync.Once實(shí)現(xiàn)高效單例模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
一文帶你使用golang手?jǐn)]一個(gè)websocket中間件
這篇文章主要為大家詳細(xì)介紹了如何使用golang手?jǐn)]一個(gè)websocket中間件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下2023-12-12
利用golang的字符串解決leetcode翻轉(zhuǎn)字符串里的單詞
這篇文章主要介紹了利用golang的字符串解決leetcode翻轉(zhuǎn)字符串里的單詞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
go-cqhttp權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼
這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類(lèi)型
這篇文章主要介紹了golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類(lèi)型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
golang字符串轉(zhuǎn)64位整數(shù)的示例代碼
這篇文章主要介紹了golang字符串轉(zhuǎn)64位整數(shù),在Go語(yǔ)言中,可以使用strconv包中的ParseInt函數(shù)將字符串轉(zhuǎn)換為64位整數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
Go語(yǔ)言實(shí)現(xiàn)本地緩存的策略詳解
今天給大家分享的是Go語(yǔ)言本地緩存的一些內(nèi)容,主要是結(jié)合bigcache和fastcache兩個(gè)優(yōu)秀的開(kāi)源代碼庫(kù),總結(jié)一些設(shè)計(jì)思路和感悟,文章通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07

