dongren9739 2016-01-15 18:09
浏览 9
已采纳

替换接口值

I want to replace an interface's value like this:

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})
", f)
    swap(f)
    fmt.Printf("%s (want &{new})", f)
}

But i get:

&{old}
&{old}

I tried around with various calls (fooer *= z, *fooer = *z, ..) but I cant seem to get it right.

You can try this example at play.golang: http://play.golang.org/p/EZEh3X8yHC


Okay, I think it works like this:

func swap(fooer Fooer) {
    foo, _ := fooer.(*Foo)
    *foo = *z
}
  • 写回答

1条回答 默认 最新

  • drfkl66684 2016-01-15 18:20
    关注

    Like most things in Go, interfaces are simply values. Assigning a new value within a function isn't going to change the value copied into the function arguments.

    Because you want to replace the interface value, you need a pointer to the value just like you would any other. It's a very rare case where you could use a pointer to an interface: 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})
    ", f)
        swap(&f)
        fmt.Printf("%s (want &{new})", f)
    }
    

    But, since a pointer to an interface is almost always a mistake (you can see we have to be very explicit to make this work), you should really have a good reason for implementing something this way, and document it well.

    What you most likely want is to extract the pointer from the interface, and assign a new value in there (which is what you added to end of your question). This is a much better construct, but the type must match, so the interface isn't needed.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题