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

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

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

Go
繁星点点滴滴 2022-08-09 20:22:55
当我的函数被赋予一个接口参数作为指针时,我想将指针更新到其他内容(a* = b*)。如果函数参数不是接口,而是指针,则此方法工作正常。给定以下代码: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 := &demoStruct{name: "frank"}    fmt.Println(d1)    Update(d1)    fmt.Println(d1)}输出为&{frank}&{frank}&{bob}&{frank}然而,我实际上期望&{frank}&{frank}&{bob}&{bob}如果我替换 Update 函数签名以接受 *demoStruct 而不是 demoInterface,它将按预期工作。当函数签名是接口而不是指针时,有没有办法让它按预期工作。
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如果您确实需要它,则可能是指向接口的指针可能有意义的罕见情况之一。下面是用它修改的示例:


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)

}

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


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

添加回答

举报

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