我在测试 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)
具体来说,我需要可以将接口指针传递给接受接口作为参数的函数的方法。
谢谢!
interface{}
作为第一个参数some
one
给some
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
的指向类型,则会发生恐慌。