Go语言 替换接口的值

dba5bblo  于 4个月前  发布在  Go
关注(0)|答案(2)|浏览(59)

我想像这样替换一个接口的值:

package main
import "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
}

wxclj1h5

wxclj1h51#

像Go语言中的大多数东西一样,接口只是值。在函数中添加一个新值不会改变复制到函数参数中的值。
因为你想替换接口值,你需要一个指向该值的指针,就像你需要任何其他指针一样。

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)
}

字符串
但是,由于指向接口的指针几乎总是一个错误(你可以看到我们必须非常明确地做到这一点),你应该有一个很好的理由来实现这种方式,并记录它。
你最可能想要的是从接口中提取指针,并在那里分配一个新值(这就是你在问题末尾添加的内容)。这是一个更好的构造,但类型必须匹配,因此不需要接口。

piwo6bdm

piwo6bdm2#

我认为这样更好。你指定“new”字符串来替换Foo示例中的“old”。

...

func swap(fooer Fooer) {
    fooer.Foo(z.foo)
}

func main() {
    f := Foo{foo: "old"}
    fmt.Printf("%s (want &{old})", f)
    fmt.Println("")

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

}

字符串

相关问题