代码之家  ›  专栏  ›  技术社区  ›  Gabe Tucker

无法在golang中分配接口对象指针

  •  0
  • Gabe Tucker  · 技术社区  · 2 年前

    我正在做一个函数,它将任意变量类型从一个变量参数解包成如下变量:

    package main
    
    import (
        "fmt"
    )
    
    func unpackVariadic(variadic []interface{}, into ...*interface{}) {
        for i, v := range into {
            *v = variadic[i]
        }
    }
    
    func Update(variadic ...interface{}) {
        var a, b interface{}
        unpackVariadic(variadic, &a, &b)
    
        a = "Hey"
        b = "Hello"
    }
    
    func main() {
        a, b := "Hola", "Hola"
        Update(&a, &b)
        fmt.Println(a)
        fmt.Println(b)
    }
    

    然而,它正在打印 "Hola", "Hola" 而不是 "Hey", "Hello" 我想怎样。

    我的理解是 a b 在里面 Update() main() 具有不同的参考值,意味着从内部重新分配 更新() 将仅在本地分配 b 从原始地址 b 新字符串的值。

    为了解决这个问题,我尝试重新分配 b 通过其对象指针:

    func Update(variadic ...interface{}) {
        var a, b *interface{}
        unpackVariadic(variadic, a, b)
    
        *a = "Hey"
        *b = "Hello"
    }
    

    但是,当我这么做的时候 invalid operation: cannot indirect a (variable of type interface{}) .

    那么,为什么我不能在 更新() 虽然我可以进去 unpackVariadic ? 我该怎么做才能有所不同呢?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Burak Serdar    2 年前

    让我们看看变量类型:

    Update(&a, &b) ,传递的值为 *string 价值观在里面 unpackVariadic interface{} 变量,所以它们都是 *字符串

    当你这么做的时候 a = "Hey" ,则丢弃 *字符串 中的值 a 并将其重新分配给字符串值。此赋值仅更改 在里面 ,它不会更改传递给它的接口的值。

    要更改切片参数的值,请执行以下操作:

    *a.(*string) = "Hey"
    *b.(*string) = "Hello"
    

    这将为的内容分配新值 b ,而不是指定 b ,因此,修改从 main .