Go中的自动类型断言

时间:2014-09-22 15:24:16

标签: struct interface go

获取此代码示例(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函数?

2 个答案:

答案 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)
}

如果密钥不存在或不是预期的类型,您可能需要添加错误检查。