我和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 {}
类型给出了类型的变化...所以我把它排除在外因为它会使代码混乱。但是,如果我在具有可选的带星号返回属性的后续块上使用interface {}
(例如" NewMessageObject"),则JSON构造函数似乎忽略这些值,因为它们包含在空接口中而不是仅仅暴露为他们的原始类型。但是,他们必须有一个零选项......
出了什么问题?一般的设计? 我基本上是试图通过基于输入数据的后续调用来构建JSON对象响应(或返回带有JSON格式的错误)......以一种巧妙的抽象方式。
答案 0 :(得分:1)
要解决你的json问题,你可以使用一个结构并用json标记每个字段:" omitempty":
package main
import (
"encoding/json"
"fmt"
)
type foostruct struct {
Myfoo string `json:"myfoo,omitempty"`
Yourfoo string `json:"yourfoo,omitempty"`
Ourfoo string `json:"ourfoo,omitempty"`
}
func main() {
j := []byte("{\"myfoo\":\"mine\", \"yourfoo\":\"yours\"}")
fstruct := &foostruct{}
err := json.Unmarshal(j, fstruct)
if err != nil {
panic(err)
}
b, err := json.Marshal(fstruct)
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
您会看到输出中不包含字段" ourfoo":
{"myfoo":"mine","yourfoo":"yours"}