为什么这个匿名func返回相同的struct实例?

Dan*_*nte 4 go

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()
}
Run Code Online (Sandbox Code Playgroud)

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

为什么这个匿名func返回所请求类型的相同实例,如何让它在每次调用时返回一个新实例?

Pau*_*kin 6

你比较两个接口one == two.让我们看一下语言规范对这个表达式含义的看法:

接口值具有可比性.如果两个接口值具有相同的动态类型和相等的动态值,或者两者的值都为nil,则它们相等.

指针值具有可比性.如果两个指针值指向同一个变量或两者的值都为nil,则它们相等.指向不同零大小变量的指针可能相同也可能不相等.

在你的榜样,两者onetwo均为接口值,并且它们具有相同的动态类型(*fake).它们的动态值都是指向零大小对象的指针,正如您在上面所读到的,在这种情况下,相等可能也可能不成立.

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

这可能看起来像这样:

type fake int

func main() {
    var uniq fake
    f := func() interface{} {
        uniq++
        return uniq
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

目前还不清楚你想要达到的目标,所以这对你来说可能是也可能不是一个好的解决方案.