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

替换接口值

替换接口值

Go
Helenr 2021-12-07 10:38:41
我想像这样替换接口的值:package mainimport "fmt"type Fooer interface {Foo(string)}type Foo struct {foo string}func (f *Foo) Foo(bar string) {f.foo = bar}var z = &Foo{foo : "new"}func swap(fooer Fooer) {fooer = z}func main() {    f :=  &Foo{foo: "old"}    fmt.Printf("%s (want &{old})\n", f)    swap(f)    fmt.Printf("%s (want &{new})", f)}但我得到:&{old}&{old}我尝试了各种调用 ( fooer *= z, *fooer = *z, ..) 但我似乎无法做到正确。你可以在 play.golang 试试这个例子:http ://play.golang.org/p/EZEh3X8yHC好的,我认为它是这样工作的:func swap(fooer Fooer) {    foo, _ := fooer.(*Foo)    *foo = *z}
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

像 Go 中的大多数东西一样,接口只是值。在函数内分配新值不会更改复制到函数参数中的值。


因为您想替换接口值,所以您需要一个指向该值的指针,就像其他任何值一样。这是一种非常罕见的情况,您可以使用指向接口的指针:http : //play.golang.org/p/EZEh3X8yHC


func swap(fooer *Fooer) {

    z := Fooer(&Foo{foo: "new"})

    *fooer = z

}


func main() {

    var f Fooer = &Foo{foo: "old"}

    fmt.Printf("%s (want &{old})\n", f)

    swap(&f)

    fmt.Printf("%s (want &{new})", f)

}

但是,由于指向接口的指针几乎总是一个错误(你可以看到我们必须非常明确地使这个工作),你真的应该有一个很好的理由以这种方式实现某些东西,并很好地记录它。


您最可能想要的是从界面中提取指针,并在其中分配一个新值(这是您添加到问题末尾的内容)。这是一个更好的构造,但类型必须匹配,因此不需要接口。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

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