Struct Go中的自动类型断言

Struct Go中的自动类型断言,struct,interface,go,Struct,Interface,Go,以下面的代码()为例: 当我向数据中添加某些内容时,该类型会变成一个接口{},因此当我稍后检索该值时,我必须将原始类型声明回它。例如,有没有一种方法可以为data定义一个getter函数,该函数将自动断言类型 不太可能,除非您转向并尝试以这种方式获取接口类型 但是惯用的(更快的)方法仍然是(必须在运行时检查的“类型转换”,因为数据只包含接口{}值) 如果数据引用一个特定的接口(而不是泛型的接口{}一个),比如我,那么你可以使用一个直接在它上面定义的Name()方法。不是真的,除非你转向并试图以这

以下面的代码()为例:


当我向
数据
中添加某些内容时,该类型会变成一个
接口{}
,因此当我稍后检索该值时,我必须将原始类型声明回它。例如,有没有一种方法可以为
data
定义一个getter函数,该函数将自动断言类型

不太可能,除非您转向并尝试以这种方式获取接口类型

但是惯用的(更快的)方法仍然是(必须在运行时检查的“类型转换”,因为
数据
只包含
接口{}
值)


如果数据引用一个特定的接口(而不是泛型的
接口{}
一个),比如我,那么你可以使用一个直接在它上面定义的
Name()
方法。

不是真的,除非你转向并试图以这种方式获取接口的类型

但是惯用的(更快的)方法仍然是(必须在运行时检查的“类型转换”,因为
数据
只包含
接口{}
值)


如果数据引用一个特定的接口(而不是通用的
接口{}
one),比如我,那么您可以使用直接定义在它上面的
Name()
方法。

您可以这样做,但您可能需要考虑您的设计。。你很少需要做这种事情


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

您可以这样做,但您可能需要考虑您的设计。。你很少需要做这种事情


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

为什么不给
数据
一个自己的类型,并在该类型上定义
Get(密钥字符串)*Foo
方法?为什么不给
数据
一个自己的类型,并定义
Get(密钥字符串)*Foo
方法?不知道你为什么会被否决,我不会这么做,但它仍然是正确的。我这么做了,因为我说的是一个getter来动态断言值,而不是一堆getter。那么,这是不可能的。除非你进行全面反思,否则你最好使用另一种语言。该getter应该返回哪种类型?你必须指定一个,而且只能指定一个返回类型。不知道你为什么被否决,我不会这样做,但它仍然是正确的。我这样做了,因为我说的是一个getter来动态断言值,而不是一堆getter。那么,这是不可能的。除非你进行全面反思,否则你最好使用另一种语言。该getter应该返回哪种类型?必须指定一个且只能指定一个返回类型。
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)
}
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)
}