gpt4 book ai didi

go - 为什么这个匿名函数返回相同的结构实例?

转载 作者:IT王子 更新时间:2023-10-29 00:39:50 25 4
gpt4 key购买 nike

package main

import "fmt"

type fake struct {
}

func main() {
f := func() interface{} {
return &fake{}
}

one := f()
two := f()

fmt.Println("Are equal?: ", one == two)
fmt.Printf("%p", one)
fmt.Println()
fmt.Printf("%p", two)
fmt.Println()
}

( http://play.golang.org/p/wxCUUCyz98 )

为什么这个匿名函数返回请求类型的同一个实例,我怎样才能让它在每次调用时返回一个新实例?

最佳答案

您将两个接口(interface)与 one == two 进行比较。让我们看看 language specification 是什么不得不说一下这个表达式的含义:

Interface values are comparable. Two interface values are equal if they have identical dynamic types and equal dynamic values or if both have value nil.

Pointer values are comparable. Two pointer values are equal if they point to the same variable or if both have value nil. Pointers to distinct zero-size variables may or may not be equal.

在您的示例中,onetwo 都是接口(interface)值,并且它们具有相同的动态类型(*fake)。不过,它们的动态值都是指向零大小对象的指针,正如您在上面所读到的,在这种情况下相等性可能成立,也可能不成立。

鉴于此,您可以通过不使用指向零大小结构的指针作为唯一值来解决您的问题。也许改用 int

可能看起来像这样:

type fake int

func main() {
var uniq fake
f := func() interface{} {
uniq++
return uniq
}
...
}

不清楚您要实现的目标,因此这可能是也可能不是适合您的解决方案。

关于go - 为什么这个匿名函数返回相同的结构实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16750150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com