首页 > 解决方案 > 当参数是指针时取消引用函数接口参数

问题描述

当我的函数被赋予一个作为指针的接口参数时,我想将指针更新为其他东西(a* = b*)。如果函数参数不是接口而是指针,则可以正常工作。

给定以下代码:

package main

import "fmt"

type demoInterface interface {
    GetName() string
}

type demoStruct struct {
    name string
}

func (d demoStruct ) GetName() string  {
    return d.name
}

func Update(d1 demoInterface)  {
    fmt.Println(d1)
    d2 := demoStruct{name: "bob"}
    d1 = &d2
    fmt.Println(d1)
}

func main() {
    d1 := &demoStruct{name: "frank"}
    fmt.Println(d1)
    Update(d1)
    fmt.Println(d1)
}

输出是

&{frank}
&{frank}
&{bob}
&{frank}

但是我实际上希望

&{frank}
&{frank}
&{bob}
&{bob}

如果我替换 Update 函数签名以接受 *demoStruct 而不是 demoInterface 它按预期工作。

当函数签名是接口而不是指针时,有没有办法让它按预期工作。

谢谢。

标签: gopointers

解决方案


如果你真的需要这个,它可能是指向接口的指针可能有意义的罕见情况之一。这是您修改后的示例:

package main

import "fmt"

type demoInterface interface {
    GetName() string
}

type demoStruct struct {
    name string
}

func (d demoStruct ) GetName() string  {
    return d.name
}

func Update(d1 *demoInterface)  {
    fmt.Println(*d1)
    d2 := demoStruct{name: "bob"}
    *d1 = d2
    fmt.Println(*d1)
}

func main() {
    d1 := demoInterface(demoStruct{name: "frank"})
    fmt.Println(d1)
    Update(&d1)
    fmt.Println(d1)
}

请注意,由于Updatetake *demoInterface,我们不能只传入*demoStruct(Go 没有类型协变),因此我们必须先将结构转换为接口。


推荐阅读