考虑以下代码,即响应GET' /场所/:id':
func venueShow(w http.ResponseWriter, req *http.Request) {
// get ID from params
vars := mux.Vars(req)
id := vars["id"]
// initialise new struct
var venue Venue
// select by id and scan into struct
db.First(&venue, id).Scan(&venue)
// turn it to json
response := structToJSON(&venue)
// write headers and provide response
w.Header().Set("Content-Type", "application/json")
w.Write(response)
}
和
func structToJSON (s interface{}) (response []byte) {
// turn it into pretty-ish json
response, err := json.MarshalIndent(&s, "", " ")
if err != nil {
return []byte("Venue does not exist")
}
// return the json as the reponse
return response
}
我的structToJSON函数将空接口作为参数,因为我想将各种不同的结构传递给函数,并将它们作为JSON喷出。
然而,它并没有让我觉得非常安全。如果有任何东西满足空接口,我可以将任何我想要的东西传递给该函数,并且当json.Marshal尝试做它的业务时可能会发生各种错误。这个(我想)会被编译器捕获而不是在运行时捕获,但有更安全的方法吗?
我可以为我传递给它的每种不同类型的Struct / Model复制structToJSON方法,但那不是很干。
由于
答案 0 :(得分:3)
Marshal函数还接收其参数为interface{}
,因此无法检测您是否在编译时传递了一些无效的东西,它们都是在运行时捕获的。
您可以做的一件事是检查是否将无效类型传递给Marshal是检查错误类型,当您尝试将无效类型编组时,Marshal会返回UnsupportedTypeError
(例如chan
或{ {1}})因此您可以在编组时检查该错误。
所以你可以试试这样的事情:
func