如何在Golang中通过函数传递接口指针?

4

我正在测试 Golang 的功能,发现可以将接口的指针用作接口本身。在下面的代码中,如何确保 one 的值更改为 random

package main

import (
    "fmt"
)

func some(check interface{}) {
    check = "random"
}

func main() {
    var one *interface{}
    some(one)
    fmt.Println(one)
}

具体而言,我需要知道如何将接口指针传递给一个接受接口参数的函数。谢谢!
1个回答

12
  1. 将指向 interface{} 的指针作为第一个参数接受到 some
  2. one 的地址传递给 some
package main

import (
    "fmt"
)

func some(check *interface{}) {
    *check = "random"
}

func main() {
    var one interface{}
    some(&one)
    fmt.Println(one)
}

如果您想保持some的相同签名,您将需要使用reflect包来设置interface{}指针值:

https://play.golang.org/p/ksz6d4p2f0

package main

import (
    "fmt"
    "reflect"
)

func some(check interface{}) {
    val := reflect.ValueOf(check)
    if val.Kind() != reflect.Ptr {
        panic("some: check must be a pointer")
    }
    val.Elem().Set(reflect.ValueOf("random"))
}

func main() {
    var one interface{}
    some(&one)
    fmt.Println(one)
}

注意:val.Elem().Set()如果传递的值不可分配给 check 指向的类型,则会引发 panic。

https://play.golang.org/p/ocqkeLdFLu


我们能否在不改变 some 函数的参数类型的情况下做些什么? - re3el
@re3el,这与你所问的问题相反。 - RayfenWindspear
1
@re3el:已更新答案。 - user142162
你可以使用 val.CanSet() 代替 val.Kind() != reflect.Ptr。 - Marco Altieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接