Go语言中如何通过变量v更新切片args[0]的存储值?
问题:如何通过变量v更新Go中args[0]的值?
问题描述
直接使用args[0] = ...可以成功更新args[0]的值,示例代码如下:
package main import "fmt" func MyFunc(lambda any) { myVars := []any {0} for i := 0; i < 30; i++ { lambda.(func(...any))(myVars...) fmt.Println(myVars[0]) // 输出:0, 2, 4, ..., 60 (符合预期) } } func main() { MyFunc(func(args ...any) { args[0] = args[0].(int) + 2 }) }
但如果先将args[0]赋值给变量v,再尝试通过v = ...更新args[0],Go会为v分配新的对象,无法修改args[0]的原始值,示例代码如下:
package main import "fmt" func MyFunc(lambda any) { myVars := []any {0} for i := 0; i < 30; i++ { lambda.(func(...any))(myVars...) fmt.Println(myVars[0]) // 输出:0, 0, 0, ..., 0 (不符合预期) } } func main() { MyFunc(func(args ...any) { v := args[0] v = v.(int) + 2 }) }
我的问题
如何通过变量v来更新args[0]的值?
已尝试方法
- 无法使用
*v = ...,触发编译错误:invalid operation: cannot indirect v (variable of type any) - 无法使用
v := args[0].(*int); *v = *v + 2;,触发运行时错误:panic: interface conversion: interface {} is int, not *int
解决方案
方案1:修改v后重新赋值回args[0]
因为v是args[0]的值拷贝,修改v不会影响原切片元素,所以需要将更新后的v重新赋值给args[0],代码示例:
package main import "fmt" func MyFunc(lambda any) { myVars := []any {0} for i := 0; i < 30; i++ { lambda.(func(...any))(myVars...) fmt.Println(myVars[0]) // 输出:0,2,4,...,60 (符合预期) } } func main() { MyFunc(func(args ...any) { v := args[0].(int) v += 2 args[0] = v // 关键步骤:将修改后的v赋值回args[0] }) }
方案2:将指针存入any类型中
如果希望直接通过指针修改原变量,可以在初始化myVars时存入int指针而非int值,这样取出后可通过指针直接修改原变量,无需重新赋值:
package main import "fmt" func MyFunc(lambda any) { num := 0 myVars := []any {&num} // 存储int指针 for i := 0; i < 30; i++ { lambda.(func(...any))(myVars...) fmt.Println(num) // 输出:0,2,4,...,60 (符合预期) } } func main() { MyFunc(func(args ...any) { v := args[0].(*int) // 类型断言为*int *v += 2 // 通过指针修改原变量的值 }) }
内容的提问来源于stack exchange,提问作者gabetucker22
相关产品推荐
相关产品推荐

