首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >go中的类型转换

go中的类型转换
EN

Stack Overflow用户
提问于 2020-10-12 15:24:42
回答 1查看 31关注 0票数 0

我是个新手,在访问运行时未知结构的数据时遇到了问题:

代码语言:javascript
运行
复制
type Nested struct {
  Value string
}

type TypeA struct {
  Nested
  Foo string
}

type TypeB struct {
  Nested
  Bar string
}

我必须实现以下回调:

代码语言:javascript
运行
复制
func Callback(param interface{}) {

}

param可以是*TypeA*TypeB

如何强制转换类型转换/强制转换param,以便访问两种类型通用的已知Nested元素?

因为接口是隐式实现的,所以我认为我可以这样做

代码语言:javascript
运行
复制
type Whatever struct {
  Nested
}

然后

代码语言:javascript
运行
复制
func Callback(param interface{}) {
  nst := param.(*Whatever)
  fmt.Printf(nst.Nested.Value)
}

然而,这会导致

interface {} is *misc.TypeA, not *misc.Whatever

提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-12 15:30:21

如果param中的动态值是*misc.TypeA类型,则只能type assert *misc.TypeA

这样做,您就可以访问Nested字段:

代码语言:javascript
运行
复制
func Callback(param interface{}) {
    nst := param.(*TypeA)
    fmt.Printf(nst.Nested.Value)
}

如果它可以是更多类型的值,请使用type switch

代码语言:javascript
运行
复制
func Callback(param interface{}) {
    switch nst := param.(type) {
    case *TypeA:
        fmt.Println(nst.Nested.Value)
    case *TypeB:
        fmt.Println(nst.Nested.Value)
    }
}

测试:

代码语言:javascript
运行
复制
a := &TypeA{
    Nested: Nested{Value: "val"},
}
Callback(a)
b := &TypeB{
    Nested: Nested{Value: "val"},
}
Callback(b)

输出(在Go Playground上试用):

代码语言:javascript
运行
复制
val
val

如果您打算在所有情况下都执行相同的操作,则可以像这样减少代码:

代码语言:javascript
运行
复制
func Callback(param interface{}) {
    var nst Nested
    switch x := param.(type) {
    case *TypeA:
        nst = x.Nested
    case *TypeB:
        nst = x.Nested
    }
    fmt.Println(nst.Value)
}

这将输出相同的内容。在Go Playground上试试。

当然,最好的方法是使用接口。使用带有GetNested() Nested方法的接口,并让您的类型实现它。并更改Callback()以接受此接口类型的值。由于您已经在使用嵌入(将Nested嵌入到TypeATypeB中),因此只需在Nested本身上实现一次此GetNested()函数就很方便:

代码语言:javascript
运行
复制
func (n Nested) GetNested() Nested {
    return n
}

type HasNested interface {
    GetNested() Nested
}

func Callback(nst HasNested) {
    fmt.Println(nst.GetNested().Value)
}

仅此而已。这将再次输出相同的内容。在Go Playground上试试这个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64313331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档