首頁 > 軟體

GoFrame通用型別變數gvar與interface基本使用對比

2022-06-09 22:00:19

前言摘要

這篇文章將介紹 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的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com