go语法入门any类型的使用场景示例详解

 更新时间:2023年09月06日 09:23:52   作者:海生  
这篇文章主要为大家介绍了go语法入门any类型的使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、介绍

在没有any类型之前,go语言中,我们经常使用interface{},来表示一个类型是未知的,或者有好几种其他基础类型的情况。
从 Go1.18开始,go官方定义了一个预声明标识符(Predeclared identifiers):any。

// any is an alias for interface{} and is equivalent to interface{} in all ways.
// any 是一个 interface{}的 别名,并且在任何情况下和interface{}相同。
type any = interface{}

官方的定义,告诉了我们any就是interface{}的别名,用来代替interface{}的。
go源码中现在也大量的使用any比如:

func Print(a ...any) (n int, err error) 
func Println(a ...any) (n int, err error)
type Pointer[T any] struct
var expunged = new(any)
dirty map[any]*entry 
func Marshal(v any) ([]byte, error) 
......

太多地方用到了,基本上go官方,用any代替了任何interface{}出现的地方。

二、any的最佳实践

2.1 在map的情况下,map更适合做key

我们先来看一个下面两个时间,大家比较一下,哪一个比较好。

func TestAny(t *testing.T) {
    m1 := make(map[any]string, 0)
    m1["1"] = "1"
    m1[2] = "2"
    var v1 string = m1["1"]
    var v2 string = m1[2]
    t.Log(v1, v2)
    m2 := make(map[string]any, 0)
    m2["1"] = "1"
    m2["2"] = 2
    var v3 string = m2["1"].(string)
    var v4 int = m2["2"].(int)
    t.Log(v3, v4)
}

结论是 m1这种方式好。为什么,因为用做key的话,这样我们无论做为保存,还是读取,都无需多做什么操作。
m2这种方式,我们需要拿到数据后,进行类型的转换。这一步还的和之前保存的一样,就很复杂。

2.2 函数的参数和返回值,any更适合做参数

在官方的json解析包里面。无论是编码还是解码,any都只是作为参数。

func Marshal(v any) ([]byte, error)
func Unmarshal(data []byte, v any) error

如果是返回值的话,我们调用这个函数,还得进行返回值的类型转换,这对于调用方,无疑是巨大负担。

但作为参数,对于调用方,是巨大的便利,他可以传入各种类型。

以上就是go语法入门any类型的使用场景示例详解的详细内容,更多关于go语法入门any类型使用的资料请关注脚本之家其它相关文章!

相关文章

  • 深入了解Golang包的获取方法

    深入了解Golang包的获取方法

    Go语言有一个获取远程包的工具就是go get,本文将详细为大家介绍一下Go语言包的获取的方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-07-07
  • Go语言正则表达式用法实例小结【查找、匹配、替换等】

    Go语言正则表达式用法实例小结【查找、匹配、替换等】

    这篇文章主要介绍了Go语言正则表达式用法,结合实例形式分析了Go语言基于正则实现查找、匹配、替换等基本操作的实现技巧,需要的朋友可以参考下
    2017-01-01
  • Golang RSA生成密钥、加密、解密、签名与验签的实现

    Golang RSA生成密钥、加密、解密、签名与验签的实现

    RSA 是最常用的非对称加密算法,本文主要介绍了Golang RSA生成密钥、加密、解密、签名与验签的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Golang sync.Pool的源码解析

    Golang sync.Pool的源码解析

    Pool是用于存放临时对象的集合,这些对象是为了后续的使用,以达到复用对象的效果,本文将详解解析sync.Pool 源码,需要的朋友可以参考下
    2023-05-05
  • Go语言中go mod vendor使用方法

    Go语言中go mod vendor使用方法

    go mod vendor的功能是将新增的依赖包自动写入当前项目的 vendor目录,下面这篇文章主要给大家介绍了关于Go语言中go mod vendor使用的相关资料,需要的朋友可以参考下
    2022-10-10
  • Go语言结构体Go range的学习教程

    Go语言结构体Go range的学习教程

    这篇文章主要为大家介绍了Go语言结构体Go range的学习教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang的锁机制使用及说明

    Golang的锁机制使用及说明

    这篇文章主要介绍了Golang的锁机制使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 基于Go编写一个可视化Navicat本地密码解析器

    基于Go编写一个可视化Navicat本地密码解析器

    这篇文章主要给大家介绍了基于Go编写一个可视化Navicat本地密码解析器的方法,文中有详细的代码示例和图文介绍,有需要的朋友可以参考阅读本文
    2023-08-08
  • Go语言关于几种深度拷贝(deepcopy)方法的性能对比

    Go语言关于几种深度拷贝(deepcopy)方法的性能对比

    这篇文章主要介绍了Go语言关于几种深度拷贝(deepcopy)方法的性能对比,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 详解Go语言中上下文context的理解与使用

    详解Go语言中上下文context的理解与使用

    在Go的日常开发中,Context上下文对象无处不在,这篇文章小编就来带大家深入了解一下上下文context的理解与使用,文中的示例代码讲解详细,需要的可以参考下
    2023-10-10

最新评论