我认为这是一件很简单的事情,但我错了。我无法使用integer
将interface{}
作为指针传递给函数。
示例:
var test int
someChange(&test)
fmt.Printf("after function: %d", test)
func someChange(i interface{}) error{
newFunnyValue := 42
i = newFunnyValue
fmt.Printf("hello from someChange now value test is: %d" , i)
return nil //change gone ok, so nil
}
结果:
hello from someChange now value test is: 42
after function: 0
我认为interface{}
与void*
类似,所以上面的代码应该有效,但不是,为什么?我想补充一点,如果我传递一个结构对象,一切都很好。
我是否必须将int
包裹在某个结构中?
编辑:
答案 0 :(得分:3)
如果要观察someChange()
函数之外的变化(在test
变量中),则必须修改指向值(为其指定新值) )。您没有这样做,只需为i
参数(someChange()
内的局部变量)分配一个新值。
您可以使用type assertion从*int
接口变量获取i
指针,然后您可以为指向的值指定新值。
示例:
func someChange(i interface{}) error {
newFunnyValue := 42
if p, ok := i.(*int); ok {
*p = newFunnyValue
return nil //change gone ok, so nil
}
return errors.New("Not *int")
}
测试它:
var test int
someChange(&test)
log.Printf("after function: %d", test)
输出(在Go Playground上尝试):
2009/11/10 23:00:00 after function: 42
请注意,在结构中包装int
值或*int
指针是不必要的,如果您没有为指向的对象分配新值,则不会产生任何影响。
答案 1 :(得分:1)
i
仍然属于interface{}
中的func someChange()
类型。你必须在任务期间施放它:
*i.(*int) = 42