为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中为结构创建nil接口

如何在golang中为结构创建nil接口

Go
呼如林 2023-01-03 17:08:18
我是 Golang 的新手。我执行了下面的代码。最后我得到了空的人类数组。我应该在func F中做什么?为了测试(monkeypatch)。我必须遵循调用 origin func 的方式。package mainimport (    "fmt")type Human struct {    Name string}type Cat struct {    Name string}func F(arr interface{}) {    switch arr.(type) {    case *[]*Human:        arr = &[]*Human{{Name: "abc"}}        arr = arr.(*[]*Human)    case *[]*Cat:        arr = &[]*Cat{{Name: "meow"}}        arr = arr.(*[]*Cat)    }}func main() {    var humans []*Human    F(&humans)    fmt.Println(humans)    var cats []*Cat    F(&cats)    fmt.Println(cats)}
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

答案,也是主要的问题原因,是当参数传递给函数或分配给变量时, Go总是使用按值传递(或值的副本)。


您的函数F需要一个arr参数:


func F(arr interface{}) {

    //...

}

当从您的main函数调用时,您将传递一个[]*Human指针作为参数,这些值将被复制并提供给您的函数F以供执行。


回到您的函数F体,arr将具有与 main 传递的相同值,这恰好是原始[]*Human结构的地址。在将新值分配给时arr:


func F(arr interface{}) {

    switch arr.(type) {

    case *[]*Human:

        arr = &[]*Human{{Name: "abc"}}

        // ...

    }

}

您正在为局部变量而不是原始指针分配一个新值,该 arr指针实际上保持不变。


要更新参数指针指向的值,您应该使用dereferrence符号:


func F(arr interface{}) {

    switch arr := arr.(type) {

    case *[]*Human:

        *arr = []*Human{&Human{Name: "abc"}}

        fmt.Println(arr)

    // ...

    }

}

请注意switch arr := arr.(type)创建具有动态类型的新arr变量(隐藏参数arr)的语句,interface以便能够为其分配适当的值。


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信