golang中字段的接口

时间:2015-03-12 15:44:47

标签: inheritance go

我们说我有一个结构应该用作上传的结果:

type uploadResult struct {
  Filename string `json:"filename"`
  Code string `json:"code"`
  Reason string `json:"reason"`
}

会有像这样的其他结构,都有一个字段Code,另一个名为Reason。因此,有一个类似于通用接口(伪代码;这个不起作用)的东西会很有趣:

type apiResult interface {
  Code string `json:"code"`
  Reason string `json:"reason"`
}

因为我想调用一个提取一些常见字段的函数,但只提取那些常见的字段:

func failExit(result apiResult) {
  fmt.Println(result.Reason)
}

那么我该如何重写它以便它能达到我所期待的目标呢?

祝你好运

2 个答案:

答案 0 :(得分:4)

您应该能够在特定结构中嵌入具有公共字段的结构。

现场演示: http://play.golang.org/p/7Ju-r-yE1-

type apiResult struct {
  Code string `json:"code"`
  Reason string `json:"reason"`
}

func failExit(result apiResult) {
  fmt.Println(result.Reason)
}

type uploadResult struct {
  Filename string `json:"filename"`
  apiResult // <-- embedded
}

func main() {
  var ul uploadResult
  ul.Code = "...some code..."
  ul.Reason = "The description"
  ul.Filename = "foo.txt"

  failExit(ul.apiResult)
}

因此在这种情况下不应该真正需要接口。只需将apiResult嵌入到需要它的结构中。

答案 1 :(得分:0)

长话短说,Go接口不允许声明字段,因为从概念上讲它们处理行为而不是数据。字段是数据。

有几种方法可以解决你想做的事情:

以下是关于如何处理此问题的一些示例:

这个使用接口将APIResult字段公开为apiResponse接口的一部分: http://play.golang.org/p/ONLzvqlP5R

这个使用接口将APIResult公开为任何包含一个Result结构的结构的一部分: http://play.golang.org/p/NzxPHhDls_

在这方面,您可以通过使用组合来解决这个问题,方法是让APIResponse成为具有公共字段的结构,然后需要这些字段的任何其他结构导出APIResponse结构。

type APIResult struct {
    Code   string `json:"code"`
    Reason string `json:"reason"`
}

type UploadResult struct {
  Filename string `json:"filename"`
  APIResult
}

func failExit(result APIResult) {
  fmt.Println(result.Reason)
}

http://play.golang.org/p/k85vTJoFRn