参数为指针时的取消引用函数接口参数

当我的函数被赋予一个接口参数作为指针时,我想将指针更新到其他内容(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,它将按预期工作。


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


繁星点点滴滴
浏览 95回答 1
1回答

慕姐4208626

如果您确实需要它,则可能是指向接口的指针可能有意义的罕见情况之一。下面是用它修改的示例:package mainimport "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)}请注意,由于 take ,我们不能只是传入(Go 没有类型协方差),因此我们必须首先将结构转换为接口。Update*demoInterface*demoStruct
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go