go - 如何将接口(interface)变量分配给另一个接口(interface)变量存储的值

标签 go memory-management

问题描述:

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 (good)
    }
}

func main() {
    MyFunc(func(args ...any) {
        args[0] = args[0].(int) + 2
    })
}

但是当我创建变量 v := args[0] 并尝试通过执行 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 (bad)
    }
}

func main() {
    MyFunc(func(args ...any) {
        v := args[0]
        v = v.(int) + 2
    })
}

我的问题:

如何使用 v 更新 args[0]?任何帮助将不胜感激。

我尝试过的事情:

我无法执行*v = ...,因为这会产生编译器错误“无效操作:无法间接 v(任何类型的变量)”

我不能这样做 v := args[0].(*int); *v = *v + 2;,因为这会产生运行时错误“ panic :接口(interface)转换:接口(interface) {} 是 int,而不是 *int”

最佳答案

您没有正确执行指针操作。类型断言指针变量v。首先使用 & 获取 arg 值的地址,然后继续执行其余逻辑。

func main() {
    MyFunc(func(args ...any) {
        v := &args[0]
        *v = (*v).(int) + 2
    })
}

Go playground

关于go - 如何将接口(interface)变量分配给另一个接口(interface)变量存储的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73564570/

相关文章:

string - int 到 string 的转换在 Go 中是如何工作的?

xml - 如何为具有属性和内容的元素指定XML结构标签?

c++ - 在返回泄漏的内存时修复内存泄漏?

go - 如何格式化持续时间

struct - Golang - 嵌套结构中的 slice

go - Golang处理错误返回时删除重复的代码

c++ - 从类中删除指向 this 的指针?

c - 设置调整大小时出现内存错误

java - Jboss(Java) 进程对驻留内存使用量的逐渐增加

使用 & 和不使用 & 的 C 3d 数组指针衰减