Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Golang中的函数传递接口指针?_Go_Interface - Fatal编程技术网

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

如何通过Golang中的函数传递接口指针?,go,interface,Go,Interface,我在测试golang功能时,遇到了这个概念,我可以使用接口指针作为接口本身。在下面的代码中,如何确保one的值更改为random package main import ( "fmt" ) func some(check interface{}) { check = "random" } func main() { var one *interface{} some(one) fmt.Println(one) } 具体来说,我需要一种方法,可以将接

我在测试golang功能时,遇到了这个概念,我可以使用接口指针作为接口本身。在下面的代码中,如何确保
one
的值更改为
random

package main

import (
    "fmt"
)

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

func main() {
    var one *interface{}
    some(one)
    fmt.Println(one)
}
具体来说,我需要一种方法,可以将接口指针传递给接受接口作为参数的函数

谢谢

  • 接受指向
    接口{}
    的指针作为
    some
  • one
    的地址传递给
    some
  • 如果要保留
    some
    的相同签名,则必须使用
    reflect
    包设置
    接口{}
    指针值:

    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
    的指向类型,则
    val.Elem().Set()将死机。

    我们可以在不更改
    some
    函数的参数类型的情况下做些什么吗?@re3el这与您的问题相反asked@re3el:更新的答案。而不是val.Kind()!=reflect.Ptr,可以使用val.CanSet()
    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)
    }