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


猜你喜欢
- a=1 #1 为对象,def func(x): print('x的地址{}'.form
- 在用python进行图像处理时,有时需要遍历numpy数组,下面是遍历数组的方法:[rows, cols] = num.shape for
- 展示:一般情况下序列化得到的外键的内容只是id:...{ fields: { uat_date: "2015-07-
- 我有的时候写程序要用到当前时间,我就想用python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次,为了能够更好的记住,我今天特意
- Python中的数据可视化matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地
- 官网:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads我的系统
- 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户的年龄,根据年龄打印不同的内容。。。Python程序中,能让计算机
- 这几天忙个合作,开发iPhone版校友录。用了很久的iPhone,为它量身定制一套页面还是头一次,好在限制不是很多,会写html基本呈现就不
- 生成器(generator)概念生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIter
- 本文实例讲述了python获取文件后缀名及批量更新目录下文件后缀名的方法。分享给大家供大家参考。具体实现方法如下:1. 获取文件后缀名:#!
- 接着前面Django入门使用示例今天我们来看看Django是如何加载静态html的?我们首先来看一看什么是静态HTML,什么是动态的HTML
- 在所有信息技术领域,网页设计、网站设计长期是个几乎搞不清楚的、弱势的、被边缘化的职能职位。但近些年发展中,不断有远见卓识的从业者认识到,“设
- 1.在vue项目根目录下新建vue.config.js(不是在src下面)vue.config.js配置文件:module.exports
- 1. 箭头函数的使用ES6 中新增了使用箭头=>来定义函数表达式的方法。很多情况下,箭头函数和函数表达式创建的函数并无区别,只有写法上
- 写 python 文件时,每个文件开头都必须注明版本和编码。每次我 touch 文件之后粘贴这两句话让我不胜其烦。由于我没有安装 pytho
- Pycharm运行时总是跳出Python Console最近运行程序的时候发现,每次点击运行之后,都是出现的Python Console。最
- Keepalived由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+hap
- 例如:select (a+b) as c from 表 类型也一致都是varchar型的,可就是显示不正确。 直到concat() MySQ
- 本文实例讲述了Python udp网络程序实现发送、接收数据功能。分享给大家供大家参考,具体如下:1. udp网络程序-发送数据创建一个基于
- 最近,同事需要从数个表中查询用户的业务和报告数据,写了一个SQL语句,查询比较慢:Select S.Name,S.AccountantCod