将切片传播为args列表

时间:2018-12-21 01:14:39

标签: go

我有这个功能:

func Middleware(adapters ...interface{}) http.HandlerFunc {
    // ...
}

我正试图通过以下方式调用它:

middleware := []mw.Adapter{mw.Error(),mw.Auth("x-huru-api-token")}
router.HandleFunc("/person_data_field", 
mw.Middleware(middleware...,h.makeGetMany(v))).Methods("GET")

虽然无法编译,但我得到:

enter image description here

无论如何,我都需要扩展切片,以便将其作为多个参数发送,而不仅仅是一个arg ...

使用JS,看起来就像这样:

const v = [1,2,3];

const f = function(...values){
    console.log(values);  // [1,2,3,4]
};

f(...v,4);

1 个答案:

答案 0 :(得分:4)

您可以单独或作为单个切片传递可变参数。您不能混搭。 slice元素类型必须与可变参数类型匹配。

要解决此问题,请将所有可变参数放在[]interface{}的一部分中:

middleware := []interface{}{mw.Error(),mw.Auth("x-huru-api-token"), h.makeGetMany(v)}
router.HandleFunc("/person_data_field", mw.Middleware(middleware...)).Methods("GET")

如果您不能如上一个片段所示直接构建切片,请使用slice tricks

middleware := []mw.Adapter{mw.Error(),mw.Auth("x-huru-api-token")}
router.HandleFunc("/person_data_field", mw.Middleware(
    append(append([]interface{}{}, middleware...), h.makeGetMany(v)))).Methods("GET")