gpt4 book ai didi

go - 将指针变成接口(interface)后如何检查指针

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:16 26 4
gpt4 key购买 nike

如何比较转换为接口(interface)的指针?

package main

import (
"fmt"
)

type ContainerInterface interface {
Check(ContentInterface) bool
}

type ContentInterface interface {
BelongsTo(ContainerInterface) bool
}

type BaseContainer struct {}

func (container *BaseContainer) Check(content ContentInterface) bool {
return content.BelongsTo(container)
}

// The following are on a different package

type Container struct {
BaseContainer
}

func (container *Container) GetContent() Content {
return Content{container}
}

type Content struct {
container *Container
}

func (content Content) BelongsTo(container ContainerInterface) bool {
return container == content.container
}

func main() {
container := &Container{}
content := container.GetContent()
fmt.Printf("%p\n%p\n%v\n", container, content.container, container == content.container)
fmt.Println()
fmt.Println(content.BelongsTo(container))
fmt.Println(container.Check(content))
}

返回:

0xXYZXYZ
0xXYZXYZ
true

true
false

0xXYZXYZ 表示相同的内存方向,但最后一次调用在应该返回 true 时返回了 false

最佳答案

这不是“指针和接口(interface)”问题,而是“匿名组合不是继承”问题。尝试以 OOP 的方式使用 go 几乎总是错误的。

当您调用 container.Check(content) 时,因为类型 Container 没有 Check() 方法,所以它被委托(delegate)给BaseContainer 匿名嵌入类型的 Check() 方法。

但是嵌入式结构上的方法对父结构的字段或父结构本身没有任何可见性 - 所以您实际上是在检查(调用 BelongsTo())匿名 BaseContainer 嵌入结构而不是外部容器。这非常正确地返回 false。

这是通过接口(interface)完成的事实对此没有任何影响。

如果您确实想以这种方式编码,则必须在指向外部容器的 BaseContainer 类型中放置一个字段:

type BaseContainer struct {
parent ContainerInterface
}

必须在创建父结构时对其进行初始化,然后调整方法以使用它。 (尽管最好完全避免 OO 风格 :))

关于go - 将指针变成接口(interface)后如何检查指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49945190/

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