我们说我有一个结构应该用作上传的结果:
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)
}
那么我该如何重写它以便它能达到我所期待的目标呢?
祝你好运
答案 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)
}