gpt4 book ai didi

go - golang中的身份比较?

转载 作者:行者123 更新时间:2023-12-02 17:52:14 25 4
gpt4 key购买 nike

我一直在尝试构建一组结构,这些结构以基本结构为基础,并在此基础上构建变体。然而,我发现,当公共(public)代码位于基本结构中时,结构似乎没有办法识别自身。我应该怎么做?

package main

import (
"fmt"
)

type Base interface {
IsMe(other Base) bool
}

type Block struct {
}

func (b *Block) IsMe(other Base) bool {
return b == other
}

type Block2 struct {
Block
}

func main() {
b1 := &Block{}
b2 := &Block2{}
fmt.Printf("b1.IsMe(b1): %v\n", b1.IsMe(b1))
fmt.Printf("b1.IsMe(b2): %v\n", b1.IsMe(b2))
fmt.Printf("b2.IsMe(b1): %v\n", b2.IsMe(b1)) // Wrong result!
fmt.Printf("b2.IsMe(b2): %v\n", b2.IsMe(b2)) // Wrong result!
}

最佳答案

如果你真的想以假继承的方式来做,那么你当然可以按照你做的方式来做,但它实际上只适用于 unsafereflect 因为语言不是为您想做的事情而设计的。

您的问题始于使用嵌入时 x.IsMe 的来源。当你写的时候

type Block struct {}
func (b *Block) IsMe(other Base) bool { return b == other }
type Block2 struct { Block }

方法IsMe实际上关联并绑定(bind)到Block而不是Block2。因此,在 Block2 实例上调用 IsMe 实际上只是在 Block 上调用它,详细信息:

b2 := Block2{}
fmt.Println(b2.IsMe) // 0x21560
fmt.Println(b2.Block.IsMe) // 0x21560

两种方法具有相同的地址。这表明,即使 b2 具有方法 IsMe,该方法也仅从 Block 传播到 Block2 外部> 和不继承。这反过来意味着您始终有效地运行此代码:

b1 := Block{}
b2 := Block2{}
b2_embedded_block := b2.Block
b2_embedded_block.IsMe(b2)
b2_embedded_block.IsMe(b1)
// ...

这显然不起作用,因为您正在比较两个完全不同的实例。

你真正应该做的是使用嵌入链之外的一些函数来决定相等性。示例(On Play):

func IsEq(a,b Base) bool {
return a == b
}

这实际上比较了正确的实例。

关于go - golang中的身份比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601407/

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