Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 如何使用接口{}将整数作为指针传递给函数_Pointers_Go_Interface - Fatal编程技术网

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,我认为没有必要对这个简单的操作使用类型断言