Json Go-将泛型结构传递给函数

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.

考虑以下代码,该代码响应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.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")
    }
}