首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用接口{}作为通配符类型?

如何使用接口{}作为通配符类型?
EN

Stack Overflow用户
提问于 2015-07-29 04:24:17
回答 1查看 758关注 0票数 1

方案是使用公共字段传递类似的结构,并将这些结构设置为作为params传递的值:

代码语言:javascript
复制
package main

type A struct {
    Status int
}

type B struct {
    id     string
    Status int
}

// It's okay to pass by value because content is only used inside this
func foo(v interface{}, status int) {
    switch t := v.(type) {
    case A, B:
        t.Status = status // ERROR :-(
    }
}

func main() {
    a := A{}
    foo(a, 0)
    b := B{}
    b.id = "x"
    foo(b, 1)
}

令我沮丧的是,我得到了这个错误:

代码语言:javascript
复制
➜  test  go run test.go
# command-line-arguments
./test.go:15: t.Status undefined (type interface {} has no field or method Status)

如果类型广播将接口{}转换为基础类型,那么我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-29 04:39:08

尽管A和B都有状态字段,但它们不能与类型系统互换。你们每个人都必须有单独的箱子。

代码语言:javascript
复制
case A:
    t.Status = status
case B:
    t.Status = status
} 

playground link

或者,您可以使用一个实际的接口:

代码语言:javascript
复制
type HasStatus interface {
  SetStatus(int)
}

type A struct {
   Status int
}

func (a *A) SetStatus(s int) { a.Status = s }

func foo(v HasStatus, status int) {
    v.SetStatus(status)
}

full example

如果您有多个类型,所有这些类型都有一组公共字段,则可能需要使用嵌入式结构:

代码语言:javascript
复制
type HasStatus interface {
    SetStatus(int)
}

type StatusHolder struct {
    Status int
}

func (sh *StatusHolder) SetStatus(s int) { sh.Status = s }

type A struct {
    StatusHolder
}

type B struct {
    id string
    StatusHolder
}

full example

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

https://stackoverflow.com/questions/31691193

复制
相关文章

相似问题

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