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

我是 Golang 的新手。我执行了下面的代码。最后我得到了空的人类数组。我应该在func F中做什么?


为了测试(monkeypatch)。我必须遵循调用 origin func 的方式。


package main


import (

    "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)

}


呼如林
浏览 143回答 1
1回答

慕标琳琳

答案,也是主要的问题原因,是当参数传递给函数或分配给变量时, 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以便能够为其分配适当的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go