如何通过地址传递给采用接口的函数

How to pass by address to function that takes interface

我有一个 Character 接口定义如下:

type Character interface {
    SomeFunction()
}

还有一个 Player 结构定义如下:

type Player struct{}

func (r *Player) SomeFunction() { }
// Some fields and other functions....

假设我有一个函数定义为

func TakeInterface(characterValue Character) {
     // Do something
}

问题是,我想通过 地址 characterValue 作为 Player 传递,以便对它所做的更改将对 Player 调用者传入。在 Java 和 C++ 中,这很容易,但我似乎无法在 Golang 中弄清楚。我试过类似的东西,

func TakeInterface(characterValue &Character) {
    // Do something that changes characterValue
}

然后传入 Player 指针,但是当我尝试传入地址时出现错误 *Character.Character is pointer to interface, not interface

如何通过地址将 Player 传递给采用 Character/Character 指针的函数?我一直在环顾四周,但没有成功。谢谢!

你测试过你的代码了吗?我猜不会,因为它按照您期望的方式工作。调用该函数时只需将指针传递给播放器即可。

func main() {
    p := new(Player)
    TakeInterface(p)
}

func main() {
    p := Player{0}
    TakeInterface(&p)
}

在 go 中,您可以使用类型或指向类型的指针作为接受接口的函数的参数,因为两者都满足接口。你可以同时做:

    var p1 Player
    p1.SomeFunction()
    var p2 *Player
    p2.SomeFunction()

你应该完成围棋之旅:https://tour.golang.org/methods/10

完整代码如下:https://play.golang.org/p/iQIChLCziG