GoFrame通用类型变量gvar与interface基本使用对比
作者:王中阳Go 发布时间:2024-04-27 15:26:26
标签: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 ["吃饭","睡觉","打豆豆"]}
}
打印结果
来源:https://juejin.cn/post/7106712908326764552
0
投稿
猜你喜欢
- 增加操作:变量名[key] = value # 通过key添加value值,如果key存在则覆盖 &nbs
- 平常我们使用js代码获取的时间都是客户端的时间,那么有什么办法在浏览器中显示的是服务器断的时间吗?请看下面代码:<span id=&q
- 微软上周发布了一份关于 Windows Internet Explorer 8 浏览器(以下简称为 IE 8)性能优化的白皮书《Window
- 前言二维码现在是随处度可以看到,买东西,支付,添加好友只要你扫一扫就能完成整个工作,简单且方便。所以利用这个新春佳节做一个带着新春祝福的二维
- 大家都知道在Dreamwerver中可以很方便地实现记录集的分页显示,但是生成的代码的确很庞大,影响了网页的显示速度,看起来条理也不是很清晰
- 本文实例讲述了JavaScript导出Excel的方法。分享给大家供大家参考。具体实现方法如下:<html xmlns="h
- Oracle数据库在使用的过程中常常会遇到这样或那样的问题,而这些问题常常又使我们感到很困惑,本文我们总结了Oracle数据库在使用过程中的
- 什么是YOLOV4YOLOV4是YOLOV3的改进版,在YOLOV3的基础上结合了非常多的小Tricks。尽管没有目标检测上革命性的改变,但
- 本文实例为大家分享了python环境路径设置方法,以及命令行运行python脚本,供大家参考,具体内容如下找Python安装目录,设置环境路
- 一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看:1)查看mysql是否安装了innodb插件。通过下面的命令结果可知,已经
- window.location="aaa.aspx" 上面的方法只能在当前页打开,如果要在新的页面打开,最简单的是用以下
- 我们知道在国内使用 Docker,无论是 Pull、Build 还是 Push 镜像都十分慢,因为毕竟很多源都是国外的源,下载和上传慢是必然
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:// ----ajax begin $.ajax({type: "
- 前言虚拟环境是程序执行时的独立执行环境,在同一台服务器中可以创建不同的虚拟环境供不同的系统使用,项目之间的运行环境保持独立性而相互不受影响。
- 学习了简单的知识点,就会想要向有难度的问题挑战,这里必须要夸一夸小伙伴们。不过我们今天不需要做什么程序的测试,只用简单的两个代码对比,小伙伴
- python提供了大量的库,可以非常方便的进行各种操作,现在把python中实现读写csv文件的方法使用程序的方式呈现出来。在编写pytho
- 1.生成日志并通过http传输出去(通过HTTPHandler方式):#生成并发送日志import loggingfrom logging.
- 这篇日志完全是看了一篇日志后的启发,原文为: * 的eval和new Function。很少使用new Array的方式来定义数组,没想到ne
- 当你连接到MySQL服务器时,你应使用一个密码。密码不以明文在上传输。客户端连接序列中的密码处理在MySQL 4.1.1中已经升级,很安全。
- 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往