Json Go-将泛型结构传递给函数
考虑以下代码,该代码响应GET'/VICENTES/:id':Json Go-将泛型结构传递给函数,json,struct,go,Json,Struct,Go,考虑以下代码,该代码响应GET'/VICENTES/: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.
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)
}
以及:
我的structToJSON函数以一个空接口作为参数,因为我想将各种不同的结构传递给函数,并将它们作为JSON输出
然而,我觉得它不太安全。如果任何东西满足一个空接口,我可以将我想要的任何东西传递到该函数中,当json.Marshal尝试执行它的业务时,可能会发生各种错误。这(我想)会被编译器捕获,而不是在运行时捕获,但是有更安全的方法吗
我可以为传递给它的每种不同类型的结构/模型复制structToJSON方法,但这不是很简单
感谢封送处理函数也将其参数作为接口{}接收,因此无法检测您是否在编译时传递了无效的内容,所有这些都是在运行时捕获的 要检查是否向封送处理传递了无效类型,可以做的一件事是检查错误类型,封送处理在尝试封送无效类型(如
chan
或func
)时返回UnsupportedTypeError
),以便在封送处理时检查该错误
所以你可以试试这样的东西:
if err != nil {
_, ok := err.(*json.UnsupportedTypeError)
if ok {
return []byte("Tried to Marshal Invalid Type")
} else {
return []byte("Venue does not exist")
}
}
一个“JSONAGE”接口怎么样?在这个接口中,结构体知道如何对自己进行整理?不幸的是,我没有一个完整的答案,但是这样你就可以将structToJSON需求转移到你自己的对象上了。啊,好吧,我没有想到这一点。因此,使用空接口作为参数并没有真正的问题,因为我想标准库中的东西会加载。谢谢我会把这个标记为正确的!是的,sice go没有泛型,也不允许方法重载。我们很难将
接口{}
作为参数传递。
if err != nil {
_, ok := err.(*json.UnsupportedTypeError)
if ok {
return []byte("Tried to Marshal Invalid Type")
} else {
return []byte("Venue does not exist")
}
}