我在golang中有以下代码:
package main
import (
"fmt"
)
func test(data interface{}){
data="test"
}
func main() {
t :="org"
test(&t)
fmt.Println(t)
}
我试图添加指向* interface {}的指针,但是会引发错误,当我打印t
时如何分配字符串” test”?现在t
将被打印为“ org”
谢谢!!
我认为您期望interface
的魔力比实际要大得多。
考虑此程序的变体:
package main
import (
"fmt"
)
func test(p *string) {
s := "test"
p = &s
}
func main() {
t := "org"
test(&t)
fmt.Println(t)
}
您希望它打印出test
吗?如果是这样,我们有一个更大的问题。 :-)如果没有,为什么直接分配给p interface{}
时为什么期望t
的版本会更改p
?
如果我们将test
更改为通过 *p
:
func test(p *string) {
*p = "test"
}
程序does按预期打印test
。
[现在剩下的就是处理将p
声明为data interface{}
时的情况。与bserdar's answer中一样,您必须首先从*string
中的接口对象中提取基础data
指针。然后,您可以使用该指针设置main
的变量t
。您可以通过两个步骤完成此操作:
func test(data interface{}) {
p := data.(*string)
*p = "test"
}
例如,或者您可以一行完成全部操作。
您正在设置接口,而不是基础值。相反,您应该这样做
func test(data interface{}){
*data.(*string) = "aaa"
}
即,首先获取基础的字符串指针,然后设置其指向的字符串。