脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - GoFrame通用类型变量gvar与interface基本使用对比

GoFrame通用类型变量gvar与interface基本使用对比

2022-10-17 11:08王中阳Go Golang

这篇文章主要为大家介绍了GoFrame通用类型变量gvar与interface基本使用对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言摘要

这篇文章将介绍 GoFrame 通用类型变量gvar的概念,对比 interface{}的特点;以及如何设置gvar的并发安全开关等基础使用;介绍序列化示例代码。

 

通用变量 gvar

gvar 通用动态变量,支持各种内置的数据类型转换,可以作为interface{}类型的替代数据类型,并且该类型支持并发安全开关。

 

使用场景

所有需要使用interface{}类型的场景够可以用gvar替代:

  • 各种不固定数据类型格式
  • 需要频繁对变量进行数据类型转换的场景。

使用gvar代替interface{}很重要的一个原因是:gvar支持设置并发安全开关。

 

看源码学编程

 

如何设置并发安全开关呢?

在初始化的时候,使用New()方法或者Create()方法,第二个参数就是设置并发安全开关的,默认为false。

如果使用goland开发,是能看到参数含义提示的:

GoFrame通用类型变量gvar与interface基本使用对比

 

基本使用

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 
", v, v) //v的类型:gvar.Var  值:{123 false}  其中false指的是并发安全开关为false

   //设置并发安全开关为true
   var vSafe = gvar.New("123", true)
   fmt.Printf("vSafe的类型:%T  值:%v 
", vSafe, vSafe) //vSafe的类型:*gvar.Var  值:123

   fmt.Println("获取gvar的值:", v.Val()) //123

   //基本类型转换
   fmt.Printf("v.Int()转换后的类型:%T  值:%v 
", v.Int(), v.Int())
   fmt.Printf("v.Float64()转换后的类型:%T  值:%v 
", v.Float64(), v.Float64())
   fmt.Printf("v.Uint()转换后的类型:%T  值:%v 
", v.Uint(), v.Uint())

   //切片类型转换
   fmt.Printf("v.Ints()转换后的类型:%T  值:%v 
", v.Ints(), v.Ints())
   fmt.Printf("v.Strings()转换后的类型:%T  值:%v 
", v.Strings(), v.Strings())
   fmt.Printf("v.Floats()转换后的类型:%T  值:%v 
", v.Floats(), v.Floats())
}
复制代码

 

 

打印结果

GoFrame通用类型变量gvar与interface基本使用对比

 

序列化示例

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与interface基本使用对比

 

总结

通过这篇文章我们了解到GoFrame提供的gvar的概念:gvar是通用的动态变量,就像go原生提供的interface{}一样。

适用于数据类型不确定的场景,以及需要对变量类型进行频繁转换的场景。

gvar相比于go原生提供的interface{}类型特点是:gvar支持设置并发安全的开关。

以上就是GoFrame通用类型变量gvar与interface基本使用对比的详细内容,更多关于GoFrame变量gvar对比interface的资料请关注服务器之家其它相关文章!

原文地址:https://juejin.cn/post/7106712908326764552

延伸 · 阅读

精彩推荐
  • GolangGo 并发控制context实现原理剖析(小结)

    Go 并发控制context实现原理剖析(小结)

    Golang context是Golang应用开发常用的并发控制技术,这篇文章主要介绍了Go 并发控制context实现原理剖析(小结),具有一定的参考价值,感兴趣的小伙伴们可以...

    恋恋美食1732020-05-21
  • GolangGo语言入门教程之Arrays、Slices、Maps、Range操作简明总结

    Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结

    这篇文章主要介绍了Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结,本文直接给出操作代码,同时对代码加上了详细注释,需要的朋友可以参考下 ...

    junjie2492020-04-10
  • GolangGo 的入口函数和包初始化的使用

    Go 的入口函数和包初始化的使用

    本文主要介绍了Go 的入口函数和包初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    小菠萝测试笔记5152022-10-07
  • GolangGo语言的管道Channel用法实例

    Go语言的管道Channel用法实例

    这篇文章主要介绍了Go语言的管道Channel用法,实例分析了Go语言中管道的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    go语言入门指南5792020-04-17
  • Golang详解Golang五种原子性操作的用法

    详解Golang五种原子性操作的用法

    本文主要介绍了详解Golang五种原子性操作的用法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    kevinyan5402021-11-14
  • Golanggolang遍历时修改被遍历对象的示例详解

    golang遍历时修改被遍历对象的示例详解

    这篇文章主要介绍了golang遍历时修改被遍历对象的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    janbar9252021-03-26
  • Golang详解Go语言中关于包导入必学的 8 个知识点

    详解Go语言中关于包导入必学的 8 个知识点

    这篇文章主要介绍了详解Go语言中关于包导入必学的 8 个知识点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    写代码的明哥4922020-08-12
  • GolangGO语言(golang)基础知识

    GO语言(golang)基础知识

    这篇文章主要介绍了GO语言(golang)基础知识,需要的朋友可以参考下 ...

    hebedich4282020-04-12