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

re3*_*3el 2 interface go

我在测试 golang 功能时遇到了这个概念,我可以将接口的指针用作接口本身。在下面的代码,我怎么保证该值one的变化random

package main

import (
    "fmt"
)

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

func main() {
    var one *interface{}
    some(one)
    fmt.Println(one)
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我需要可以将接口指针传递给接受接口作为参数的函数的方法。

谢谢!

Tim*_*per 9

  1. 接受一个指针interface{}作为第一个参数some
  2. 将地址传递onesome
package main

import (
    "fmt"
)

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

func main() {
    var one interface{}
    some(&one)
    fmt.Println(one)
}
Run Code Online (Sandbox Code Playgroud)

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

如果要保持 的相同签名some,则必须使用reflect包来设置interface{}指针值:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

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