如何使用接口{}将整数作为指针传递给函数

时间:2016-12-28 23:18:49

标签: pointers go interface

我认为这是一件很简单的事情,但我错了。我无法使用integerinterface{}作为指针传递给函数。

示例:

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包裹在某个结构中?

编辑:

https://play.golang.org/p/rg1vabug0P

2 个答案:

答案 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