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

目录
  • 前言摘要
  • 通用变量 gvar
  • 使用场景
  • 看源码学编程
    • 如何设置并发安全开关呢?
    • 基本使用
    • 打印结果
  • 序列化示例
    • 打印结果
  • 总结

前言摘要

这篇文章将介绍 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的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go Frame gtree树形结构的使用技巧示例

    目录 树形结构 一图胜千言 查询源码 使用场景 使用入门 常用方法 示例代码 打印结果 技巧 树形结构 树形结构gtree具有以下特点: 支持排序,支持有序遍历 内存占用低 复杂度稳定 适合大数据量存储 一图胜千言 查询源码 使用场景 关联数组场景 大数据量内存CRUD 排序键值对(后面的示例就是前序遍历和后序遍历) 使用入门 我们以实例化红黑树为例(实例化B树.高度平衡树也是一样的方式) 常用方法 Set() 赋值 Keys() 获得键列表 Values() 获得值列表 Contains()

  • goFrame的gqueue与channe的区别

    目录 channel gqueue 概念 优势 底层实现 阻止进程销毁 总结 channel 首先明确一下channel的作用:用于go协程间的通信. go语言最大的特点就是支持高并发:goroutine和channel是支持高并发的重要组成部分. 单纯地将函数并发执行是没有意义的.函数与函数间需要交换数据才能体现并发执行函数的意义. 如果说 goroutine 是Go程序并发的执行体,channel就是它们之间的连接.channel是可以让一个 goroutine 发送特定值到另一个 goro

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

    目录 前言摘要 通用变量 gvar 使用场景 看源码学编程 如何设置并发安全开关呢? 基本使用 打印结果 序列化示例 打印结果 总结 前言摘要 这篇文章将介绍 GoFrame 通用类型变量gvar的概念,对比 interface{}的特点:以及如何设置gvar的并发安全开关等基础使用:介绍序列化示例代码. 通用变量 gvar gvar 通用动态变量,支持各种内置的数据类型转换,可以作为interface{}类型的替代数据类型,并且该类型支持并发安全开关. 使用场景 所有需要使用interface

  • GoFrame gredis缓存DoVar Conn连接对象 自动序列化

    目录 整体介绍 小技巧 基本使用 HSET/HGETALL操作 HMSET/HMGET操作 基本使用 Send批量指令 订阅/发布 map存取 打印结果 struct存取 打印结果 上一篇文章为大家介绍了 GoFrame gcache使用实践 | 缓存控制 淘汰策略 ,得到了大家积极的反馈. 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. 这篇文章比较硬核,爆肝2千字,阅读大约需要5~8分钟. 详细的介绍

  • 浅谈MyBatis通用Mapper实现原理

    本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程. 基本原理 通用 Mapper 提供了一些通用的方法,这些通用方法是以接口的形式提供的,例如. public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") List<T>

  • MyBatis通用Mapper实现原理及相关内容

    MyBatis通用Mapper实现原理 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程. 基本原理 通用 Mapper 提供了一些通用的方法,这些通用方法是以接口的形式提供的,例如. public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL

  • Golang接口使用教程详解

    目录 前言 一.概述 二.接口类型 2.1 接口的定义 2.2 实现接口的条件 2.3 为什么需要接口 2.4 接口类型变量 三.值接收者和指针接收者 3.1 值接收者实现接口 3.2 指针接收者实现接口 四.类型与接口的关系 4.1 一个类型实现多个接口 4.2 多种类型实现同一接口 五.接口嵌套 六.空接口 七.类型断言 总结 前言 go语言并没有面向对象的相关概念,go语言提到的接口和java.c++等语言提到的接口不同,它不会显示的说明实现了接口,没有继承.子类.implements关键

  • Mybatis中自定义TypeHandler处理枚举详解

    在Mybatis中,处理枚举类的TypeHandler有两个: EnumTypeHandler: 用于保存枚举名 EnumOrdinalTypeHandler: 用于保存枚举的序号. 在实际项目中,以上往往不能满足我们的需求. 需求分析 枚举需要包含两个属性,label(用于显示), value(实际的枚举值).数据库保存枚举值(value). 这很明显Mybatis提供的两个枚举TypeHandler不能满足我们的需求.此时,我们可以自定义一个通用的枚举TypeHandler来满足我们的需求.

  • 老生常谈PHP中的数据结构:DS扩展

    PHP7以上才能安装和使用该数据结构扩展,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置 Collection Interface:包含本库中所有数据结构通用功能的基本interface. It guarantees that all structures are traversable, countable, and can be converted to json using json_

  • 深入理解Golang的反射reflect示例

    目录 编程语言中反射的概念 interface 和 反射 Golang的反射reflect reflect的基本功能TypeOf和ValueOf 说明 从relfect.Value中获取接口interface的信息 已知原有类型[进行“强制转换”] 说明 未知原有类型[遍历探测其Filed] 说明 通过reflect.Value设置实际变量的值 说明 通过reflect.ValueOf来进行方法的调用 说明 Golang的反射reflect性能 小结 总结 参考链接 编程语言中反射的概念 在计算

  • Java 8中的Collectors API介绍

    目录 Stream.Collect() 方法 Collectors Collectors.ToList() Collectors.ToUnmodifiableList() Collectors.ToSet() Collectors.ToUnmodifiableSet() Collectors.ToCollection() Collectors.ToMap() Collectors.ToUnmodifiableMap() Collectors.CollectingAndThen() Collect

  • Spring Lifecycle的使用

    前言 小杰在前面的文章讲过可以使用 @PostConstruct.InitializingBean .xml init. @PreDestroy .DisposableBean .xml destroy来处理 Bean 的初始化和销毁,上述这些操作是属于 Bean 生命周期的. 那如果我想在容器本身的生命周期(比如容器启动.停止)上做一些工作怎么办呢?Spring 提供了以下接口. Lifecycle 定义启动/停止生命周期方法的通用接口. public interface Lifecycle

随机推荐