随着仿制药最近在Go 1.18中发布,我开始学习它们.我一般都能理解这个概念,因为我有一些过go 的Java经验.但我没有得到一些具体的实施细节.

例如:什么时候使用any而不是interface{}更合适?下面是一个例子:

func printInterface(foo interface{}) {
    fmt.Printf("%v\n", foo)
}

func printAny[T any](foo T) {
    fmt.Printf("%v\n", foo)
}

func (suite *TestSuite) TestString() {
    printInterface("foo")
    printAny("foo")
}

这两种实现都有效.然而,如果我试图用any版本打印nil,我会得到一个编译时错误:

无法推断T.

https://go.dev/play/p/0gmU4rhhaOP

如果我试着用interface{}版本打印nil,我不会得到这个错误.

那么any的用例是什么呢?与简单使用interface{}相比,它在什么时候带来了哪些好处?

我要求提供一个specific个示例,其中一个实现在客观上比另一个更合适,并且/或者可以判断specific个好处.

推荐答案

anyinterface{}alias.Spec: Interface types:

为方便起见,预声明的类型any是空接口的别名.

因为它是一个别名,所以使用哪个别名并不重要.它们是一体的.它们可以互换.你可以用一个替换另一个,代码的意思是一样的.

any更短更清晰,但仅适用于Go 1.18.

由于它们是可互换的,这也适用于:

func printInterface(foo any) {
    fmt.Printf("%v\n", foo)
}

printAny()不能工作的原因是它是一个带有类型参数的泛型函数.要使用它,它必须是instantiated(其类型参数必须指定已知类型).try 用nil调用它不携带类型信息,因此无法进行实例化,类型推断也无法工作.

如果使用带有类型信息的nil值调用它,或者显式指定类型参数(在Go Playground上try ):

printAny((*int)(nil))
printAny[*int](nil)
// Or
var r io.Reader
printAny(r)

如前所述,anyinterface{}是可互换的,所以如果你交换两个实例,你会得到相同的代码(在Go Playground上试试这个):

func printInterface(foo any) {
    fmt.Printf("%v\n", foo)
}

func printAny[T interface{}](foo T) {
    fmt.Printf("%v\n", foo)
}

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

使用恶意软件 scanner (ClamAV)时的Google云存储桶上传文件验证

VS代码,Golang格式顽固的情况与switch / case

GORM Find方法中缺少字段

Go Regexp:匹配完整的单词或子字符串,或者根本不匹配

如何解析Go-Gin多部分请求中的 struct 切片

迭代字符串并用映射值替换原始字符串中的值的惯用方法

Golang:访问any类型泛型上的字段

Go - 永远停止带有上下文的循环

如何将 DirName 和 serial 添加到 X509v3 Authority Key Identifier

Golang crypto/rand 线程安全吗?

Golang 中的泛型类型转换

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

具有嵌套重复的正则表达式

无法使用 gocsv 读取引用字段

在反向 GORM 中创建查询有一个关系

Wire google Inject with multi return from provider 函数

go-libp2p - 从流中接收字节

HTTP 重定向不呈现新页面

如何从字符串中删除多个换行符`\n`但只保留一个?