GoFrame通用類型變量gvar與interface基本使用對比
前言摘要
這篇文章將介紹 GoFrame 通用類型變量gvar的概念,對比 interface{}的特點;以及如何設置gvar的並發安全開關等基礎使用;介紹序列化示例代碼。
通用變量 gvar
gvar 通用動態變量,支持各種內置的數據類型轉換,可以作為interface{}
類型的替代數據類型,並且該類型支持並發安全開關。
使用場景
所有需要使用interface{}類型的場景夠可以用gvar替代:
- 各種不固定數據類型格式
- 需要頻繁對變量進行數據類型轉換的場景。
使用gvar代替interface{}很重要的一個原因是:gvar支持設置並發安全開關。
看源碼學編程
如何設置並發安全開關呢?
在初始化的時候,使用New()方法或者Create()方法,第二個參數就是設置並發安全開關的,默認為false。
如果使用goland開發,是能看到參數含義提示的:
基本使用
package main import ( "fmt" "github.com/gogf/gf/container/gvar" "github.com/gogf/gf/frame/g" ) func main() { var v g.Var v.Set("123") fmt.Printf("v的類型:%T 值:%v \n", v, v) //v的類型:gvar.Var 值:{123 false} 其中false指的是並發安全開關為false //設置並發安全開關為true var vSafe = gvar.New("123", true) fmt.Printf("vSafe的類型:%T 值:%v \n", vSafe, vSafe) //vSafe的類型:*gvar.Var 值:123 fmt.Println("獲取gvar的值:", v.Val()) //123 //基本類型轉換 fmt.Printf("v.Int()轉換後的類型:%T 值:%v \n", v.Int(), v.Int()) fmt.Printf("v.Float64()轉換後的類型:%T 值:%v \n", v.Float64(), v.Float64()) fmt.Printf("v.Uint()轉換後的類型:%T 值:%v \n", v.Uint(), v.Uint()) //切片類型轉換 fmt.Printf("v.Ints()轉換後的類型:%T 值:%v \n", v.Ints(), v.Ints()) fmt.Printf("v.Strings()轉換後的類型:%T 值:%v \n", v.Strings(), v.Strings()) fmt.Printf("v.Floats()轉換後的類型:%T 值:%v \n", v.Floats(), v.Floats()) }
打印結果
序列化示例
gvar 實現瞭標準庫json的序列化和反序列化接口
package main import ( "encoding/json" "fmt" "github.com/gogf/gf/frame/g" ) func main() { type Person struct { Name *g.Var Age *g.Var Hobby *g.Var } p := Person{ Name: g.NewVar("王中陽"), Age: g.NewVar(12), Hobby: g.NewVar(g.Slice{"吃飯", "睡覺", "打豆豆"}), } res, _ := json.Marshal(p) fmt.Println("序列化結果:", string(res)) //序列化結果:{"Name":"王中陽","Age":12,"Hobby":["吃飯","睡覺","打豆豆"]} //反序列化 data := []byte(`{"Name":"王中陽","Age":12,"Hobby":["吃飯","睡覺","打豆豆"]}`) p1 := new(Person) _ = json.Unmarshal(data, &p1) fmt.Println("反序列化結果:", p1) //反序列化結果: &{王中陽 12 ["吃飯","睡覺","打豆豆"]} }
打印結果
總結
通過這篇文章我們瞭解到GoFrame提供的gvar的概念:gvar是通用的動態變量,就像go原生提供的interface{}一樣。
適用於數據類型不確定的場景,以及需要對變量類型進行頻繁轉換的場景。
gvar相比於go原生提供的interface{}類型特點是:gvar支持設置並發安全的開關。
以上就是GoFrame通用類型變量gvar與interface基本使用對比的詳細內容,更多關於GoFrame變量gvar對比interface的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- GoFrame框架gredis優雅的取值和類型轉換
- GoFrame框架garray對比PHP的array優勢
- GoFrame gtree樹形結構的使用技巧示例
- Golang通脈之數據類型詳情
- GoFrame框架gset使用對比PHP Java Redis優勢