获取此代码示例(playground):
package main
import (
"fmt"
)
type Foo struct {
Name string
}
var data = make(map[string]interface{})
func main() {
data["foo"] = &Foo{"John"}
foo := data["foo"].(*Foo)
fmt.Println(foo.Name)
}
当我向data
添加内容时,类型变为interface{}
,因此当我稍后检索该值时,我必须将原始类型断言回到它上面。有没有办法,例如,为data
定义一个自动断言类型的getter函数?
答案 0 :(得分:3)
不是真的,除非你转向reflect
并尝试以这种方式获取接口的类型。
但惯用(和更快)方式仍然是type assertion("类型转换"必须在运行时检查,因为data
仅包含interface{}
值)。
如果数据要引用特定接口(而不是通用interface{}
),例如我mentioned here,那么您可以使用直接在其上定义的Name()
方法。
答案 1 :(得分:2)
你可以做这样的事情,但你可能想要考虑一下你的设计......很少有你需要来做这类事情。
http://play.golang.org/p/qPSxRoozaM
package main
import (
"fmt"
)
type GenericMap map[string]interface{}
func (gm GenericMap) GetString(key string) string {
return gm[key].(string)
}
func (gm GenericMap) GetFoo(key string) *Foo {
return gm[key].(*Foo)
}
func (gm GenericMap) GetInt(key string) int {
return gm[key].(int)
}
var data = make(GenericMap)
type Foo struct {
Name string
}
func main() {
data["foo"] = &Foo{"John"}
foo := data.GetFoo("foo")
fmt.Println(foo.Name)
}
如果密钥不存在或不是预期的类型,您可能需要添加错误检查。