我正在尝试创建接收空结构并返回该结构类型的切片的函数。
例如-
type MyStruct struct {
Id int
}
type MyOtherStruct struct {
Name string
}
getDynamicSlice(MyStruct{}) // will return []MyStruct{}
getDynamicSlice(MyOtherStruct{}) // will return []MyOtherStruct{}
在Go中实现此类功能的最佳方法是什么?
答案 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
也是一个接口。因此,整个错误处理都可以使用类似的类型开关。