Pointers 如何使用接口{}将整数作为指针传递给函数
我认为这是一件简单的事情,但我错了。我无法使用Pointers 如何使用接口{}将整数作为指针传递给函数,pointers,go,interface,Pointers,Go,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 val
接口{}
将整数作为指向函数的指针传递
例如:
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
}
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")
}
结果:
hello from someChange now value test is: 42
after function: 0
我读到,interface{}
类似于void*
,所以上面的代码应该可以工作,但它不是,为什么?我想补充一点,如果我传递了一个对象,它是一个结构,那么一切都很好
我是否必须在某个结构中包装int
编辑:
如果要在someChange()
函数(在test
变量中)之外观察更改,则必须修改指定值(为其指定新值)。您没有这样做,只需为i
参数指定一个新值(它是someChange()
中的局部变量)
您可以使用从接口变量i
获取*int
指针,然后可以将新值指定给所指的值
例如:
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
}
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)
输出(在上尝试):
请注意,在结构中包装int
值或*int
指针是不必要的,如果不为指向的对象分配新值,也不会产生任何影响。i
仍然是functc someChange()
中的接口{}
类型。你必须在作业期间施展:
*i.(*int) = 42
对就是这样。Thx,我认为没有必要对这个简单的操作使用类型断言