我正在編寫一個將JSON解碼爲結構的Go庫。 JSON有一個相當簡單的公共模式,但我希望這個庫的使用者能夠將附加字段解碼到自己的結構中,以嵌入公共結構,從而避免使用地圖。理想情況下,我想只解碼JSON一次。如何將JSON解組到另一段代碼提供的Go結構中?
目前看起來像這樣。 (爲簡潔,刪除錯誤處理。)
的JSON:
{ "CommonField": "foo",
"Url": "http://example.com",
"Name": "Wolf" }
庫代碼:
// The base JSON request.
type BaseRequest struct {
CommonField string
}
type AllocateFn func() interface{}
type HandlerFn func(interface{})
type Service struct {
allocator AllocateFn
handler HandlerFn
}
func (Service *s) someHandler(data []byte) {
v := s.allocator()
json.Unmarshal(data, &v)
s.handler(v)
}
的應用代碼:
// The extended JSON request
type MyRequest struct {
BaseRequest
Url string
Name string
}
func allocator() interface{} {
return &MyRequest{}
}
func handler(v interface{}) {
fmt.Printf("%+v\n", v);
}
func main() {
s := &Service{allocator, handler}
// Run s, eventually s.someHandler() is called
}
我沒有的事喜歡這個設置就是allocator
功能。所有的實現都將返回一個新的「子類型」BaseRequest
。在更動態的語言中,我將傳遞類型MyRequest
代替,並在庫中實例化。 Go中有類似的選項嗎?
作爲一個便箋,我建議不要爲了簡潔而刪除錯誤,因爲人們會以您的問題爲例來看看。這是一個很好的機會提醒人們,錯誤很重要。 –