我正在测试golang功能并遇到了这个概念,我可以使用接口指针作为接口本身。在下面的代码中,如何确保one
的值更改为random
。
package main
import (
"fmt"
)
func some(check interface{}) {
check = "random"
}
func main() {
var one *interface{}
some(one)
fmt.Println(one)
}
具体来说,我需要一些方法可以将接口指针传递给接受接口作为参数的函数。
谢谢!
答案 0 :(得分:3)
interface{}
的指针作为some
one
的地址传递给some
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
会发生混乱。