使用动态结构创建切片

时间:2019-10-15 15:44:12

标签: go

我正在尝试创建接收空结构并返回该结构类型的切片的函数。

例如-

type MyStruct struct {
  Id            int
}
type MyOtherStruct struct {
  Name          string
}

getDynamicSlice(MyStruct{}) // will return []MyStruct{}
getDynamicSlice(MyOtherStruct{}) // will return []MyOtherStruct{}

在Go中实现此类功能的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用类型开关:

func getStruct(i interface{}) interface{} {
    switch s := i.(type) {
    case MyStruct:
        // do something here with type MyStruct
        s.ID = 3
        return s
    case MyOtherStruct:
        // ...
        s.Name = "abc"
        return s
    }
    return i

}

https://play.golang.org/p/iTlYP9yYuQw

但是您应该谨慎处理,因为Go严格使用类型。您应该尊重这一点。

调用该函数时,应使用类型断言,以再次获取正确的类型:

s, ok := getStruct(MyStruct{}).(MyStruct)
if !ok {
    // ...
}
fmt.Println(s)

有关该模式的更多信息

因为在该问题下有很多评论是关于不使用interface{}的,所以我想在这里写一些用例。接口通常没有具体的类型信息。使用interface{}还是io.Reader都没关系。这两个接口均不允许您访问该接口下的值的参数。在谈论空接口时,您应该始终考虑这一点。

因此,如果您的函数返回接口,则始终会出现此类问题。我认为几乎每个人都已经做了很多函数,这些函数正在返回接口。因为error也是一个接口。因此,整个错误处理都可以使用类似的类型开关。