为了账号安全,请及时绑定邮箱和手机立即绑定

具有接口成员和指针接收器的结构

具有接口成员和指针接收器的结构

Go
翻阅古今 2022-05-05 16:04:10
我正在创建一个简单的排序二叉树,它是不可变的(它应该表现得像它的不可变),并且我不确定指针接收器在传递带有接口的结构时如何工作。这是我定义二叉树的方式。type btree interface {    display(io.Writer)    add(int) btree    replace(int, int)//A test to see if we are sharing nodes}二叉树节点定义如下:type node struct {    data  int    left  btree    right btree}和空的二叉树节点type empty struct{}功能与方法func createEmpty() btree {    return &empty{}}节点结构的方法//replace is just a test to see if I'm sharing nodesfunc (n *node) replace(value, replacement int) {    if n.data < value {        n.left.replace(value, replacement)    } else if n.data > value {        n.right.replace(value, replacement)    } else {        n.data = replacement    }}func (n *node) add(data int) btree {    if n.data < data {        l := &node{n.data, n.left.add(data), n.right}        return l    } else if n.data > data {        r := &node{n.data, n.left, n.right.add(data)}        return r    } else {        return n    }}func (n *node) display(w io.Writer) {    n.left.display(w)    fmt.Fprintln(w, n.data)    n.right.display(w)}空节点的方法//replace is just a test to see if I'm sharing nodesfunc (*empty) replace(_, _ int) {}func (e *empty) add(data int) btree {    en := &node{data, e, e}    return en}func (*empty) display(w io.Writer) {    fmt.Fprintln(w, "Empty")}请注意,代码确实按预期工作,但我不确定当我将带有接口成员的结构传递给指针接收器时会发生什么。接口数据结构是否被复制,但只是一个浅拷贝,所以它指向的数据保持不变?在这种情况下,是否有关于接口会发生什么的文档?
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

鉴于这种结构:


type node struct {

    data  int

    left  btree

    right btree

}

以及f带有 q 指针接收器的函数:


func (n *node) f() {}

f获得指向 a 的指针node。f对节点所做的任何更改n都将反映在用于调用的副本上f。


更准确地说,当您调用n.f()并且 ifn是 a*node时,该指针的副本被发送到f,它仍然指向与 相同的对象n。如果n不是指针,&n则将发送到f.


为了使您的代码正常工作,左右btree接口还应该包含*nodes,而不是nodes(您已经正确地这样做了)。这是因为,例如,如果您调用 ,node.left.replace您希望node.left替换 中的值。如果您有一个replace函数的值接收器,那么当您调用node.left.replace该左侧节点的副本时,将作为接收器将其发送到函数,并且修改在节点replace上不可见。node.left


希望这可以帮助。


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信