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

时间:2017-06-29 21:32:13

标签: 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)
}

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

谢谢!

1 个答案:

答案 0 :(得分:3)

  1. 接受指向interface{}的指针作为some
  2. 的第一个参数
  3. one的地址传递给some
  4. package main
    
    import (
        "fmt"
    )
    
    func some(check *interface{}) {
        *check = "random"
    }
    
    func main() {
        var one interface{}
        some(&one)
        fmt.Println(one)
    }
    

    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)
    }
    

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

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