【发布时间】:2016-04-11 16:03:30
【问题描述】:
我正在玩 Go,并且在将我从其他语言的一些“继承”设计适应它的结构时遇到了麻烦。我用 OCaml 和其他一些具有类似结构的语言进行了编码,但我很困惑。如果没有类型继承,使用共享结构从不同位置返回 JSON 会变得有点奇怪。
我必须根据需要递归遍历输入数据以构建单个 JSON 对象以进行响应。
举个例子:
{
"appVersion": "1.0.0",
"messageStatus": "received"
}
...和:
{
"appVersion": "1.0.0",
"uploadStatus": "received"
}
到目前为止,我能找到在 Go 中完成这项工作的唯一方法是将包含“appVersion”的基本结构分别复制并粘贴到两个输出生成函数中,但我不想这样做,因为我没有'不想必须维护同一组代码两次。
这是我试图解决这个问题的地方:
type JSONResponse struct {
appVersion string
}
type MessageJSONResponse struct {
JSONResponse
messageStatus string
}
type UploadJSONResponse struct {
JSONResponse
uploadStatus string
}
...然后:
type Message struct {
formattingVersion *int
}
func NewMessageObject(r *http.Request) (bool, *MessageJSONResponse) {
message := new(Message)
if (true) {
// #TODO: INSERT LOGIC HERE!
*message.formattingVersion = 2;
}
if (message.formattingVersion != nil) {
response := new(MessageJSONResponse)
response.messageStatus = "OK"
return false, errorResponse
}
return true, nil
}
...还有:
func init() {
http.Handle("/endpoints/message", JSONResponseHandler(messageHandler))
}
func JSONResponseHandler(h func (w http.ResponseWriter, r *http.Request) interface {}) http.Handler {
// #TODO - convert `JSONResponse` into actual JSON or output JSON Error!
}
func messageHandler(w http.ResponseWriter, r *http.Request) JSONResponse { // #BROKEN TYPES?
hasError, messageResponse := NewMessageObject(r)
if (hasError || messageResponse==nil) { return nil } // #TODO
////
// #TODO ... more message things.
return messageResponse;
};
这种方法(对不起,任何代码错误,真的很长,我要去睡觉了)不起作用,因为为了传递不同的返回值......类型不能改变,等等。
JSONResponseHandler 包装器方法实际上适用于我,但仅适用于 interface {} 类型,考虑到类型的变化......所以我把它省略了,因为它会混乱编码。但是,如果我在带有可选星号返回属性(例如“NewMessageObject”)的后续块上使用interface {},JSON 构造函数似乎会忽略这些值,因为它们被包装在一个空接口中,而不是仅仅作为它们的原始类型公开。但是,他们必须有一个 nil 选项....
怎么了?一般的设计? 我基本上是在尝试通过基于输入数据的后续调用以一种简洁抽象的方式构建 JSON 对象响应(或返回 JSON 格式的错误)。
【问题讨论】: