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

 更新时间:2022年6月10日 10:31  点击:264 作者:王中阳Go

前言摘要

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

通用变量 gvar

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

使用场景

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

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

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

看源码学编程

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

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

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

image.png

基本使用

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())
}
复制代码

打印结果

image.png

序列化示例

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 ["吃饭","睡觉","打豆豆"]}
}
复制代码

打印结果

image.png

总结

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

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

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

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

原文出处:https://juejin.cn/post/7106712908326764552

[!--infotagslink--]

相关文章

  • C#简单了解接口(Interface)使用方法

    这篇文章主要介绍了C#简单了解接口(Interface)使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-08
  • TypeScript中正确使用interface和type的方法实例

    在ts中定义类型由两种方式:接口(interface)和类型别名(type alias),interface只能定义对象类型,下面这篇文章主要给大家介绍了关于TypeScript中正确使用interface和type的相关资料,需要的朋友可以参考下...2021-09-15
  • Java中的abstract和interface

    abstract和interface关键字在Java中随处可见,它是Java三大特性封装、继承、多态特性的实现重要支柱之一。interface关键字用于定义接口抽象,其本质上是用于定义类型、定义类所具有的能力,下面来看看详细内容,需要的朋友可以参考一下...2021-11-03
  • 基于go interface{}==nil 的几种坑及原理分析

    这篇文章主要介绍了基于go interface{}==nil 的几种坑及原理分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-24
  • C++ COM编程之QueryInterface函数(一)

    这篇文章主要介绍了C++ COM编程之QueryInterface函数(一),QueryInterface是组件本身提供对自己查询的一个接口,需要的朋友可以参考下...2020-04-25
  • 关于PHP中interface的用处详解

    这篇文章主要给大家介绍了关于PHP中interface的用处的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用PHP具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-26
  • 使用go的interface案例实现多态范式操作

    这篇文章主要介绍了使用go的interface案例实现多态范式操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-24
  • PHP中关键字interface和implements详解

    PHP 类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此 PHP 引入了类的接口技术。下面这篇文章主要跟大家介绍了关于PHP中关键字interface和implements的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2017-06-20
  • go 类型转换方式(interface 类型的转换)

    这篇文章主要介绍了go 类型转换方式(interface 类型的转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-04
  • C#接口(Interface)用法分析

    这篇文章主要介绍了C#接口(Interface)用法,较为详细的分析了C#中接口的功能、实现及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#中接口(Interface)的深入详解

    这篇文章主要给大家介绍了关于C#中接口(Interface)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-30
  • Go语言interface详解

    这篇文章主要介绍了Go语言interface详解,本文讲解了什么是interface、interface类型、interface值、空interface、interface函数参数等内容,需要的朋友可以参考下...2020-05-01
  • C# interface与delegate效能比较的深入解析

    本篇文章是对C#中interface与delegate的效能比较进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • golang interface判断为空nil的实现代码

    这篇文章主要介绍了golang interface判断为空nil的实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-24
  • c#中的interface abstract与virtual介绍

    abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现...2020-06-25
  • c# 接口interface基础入门小例子

    用于描述类的功能,类似于契约,指示了类将:执行的工作,形参类型,返回结果类型,但本身没有执行的代码...2020-06-25
  • C#接口interface用法实例

    这篇文章主要介绍了C#接口interface用法,实例分析了C#接口的基本使用方法,需要的朋友可以参考下...2020-06-25
  • C#中实现Fluent Interface的三种方法

    这篇文章主要介绍了C#中实现Fluent Interface的三种方法,本文讲解了Fluent Interface的简单实现、使用装饰器模式和扩展方法实现Fluent Interface等3种实现方法,需要的朋友可以参考下...2020-06-25
  • C++ COM编程之QueryInterface函数(二)

    这篇文章主要介绍了C++ COM编程之QueryInterface函数(二),本文是第二篇,第一篇请参阅相关文档,需要的朋友可以参考下...2020-04-25
  • java extends/interface/implement三者的联系与区别

    extends 顾名思义是继承,继承一个父类的所有功能。interface 是接口的意思,在其中定义某些虚函数,但没有具体实现。implement 是执行实现的意思,在继承了接口定义的虚函数并实现...2019-10-20