Go args…接口{}对于方法的参数到底意味着什么?

Go args…接口{}对于方法的参数到底意味着什么?,go,Go,我指的是以下方法,它将最后一个参数作为args…interface{}) func(*sqlx.DB).Select(dest接口{},查询字符串,args…接口{})错误 据我所知,该方法接受任何类型的最后一个可变参数 所以 在前面提到的代码中,如果我注释掉B行,而不是A行,它就不起作用。我得到以下错误 sql:转换参数$1类型:不受支持的类型[]接口{},接口的一部分* 问题 这里到底发生了什么,为什么不能自动推断变量??向第三个参数传递额外的“…”有什么必要 这里到底发生了什么,为什

我指的是以下方法,它将最后一个参数作为args…interface{})

func(*sqlx.DB).Select(dest接口{},查询字符串,args…接口{})错误

据我所知,该方法接受任何类型的最后一个可变参数

所以

在前面提到的代码中,如果我注释掉B行,而不是A行,它就不起作用。我得到以下错误

  • sql:转换参数$1类型:不受支持的类型[]接口{},接口的一部分*
问题 这里到底发生了什么,为什么不能自动推断变量??向第三个参数传递额外的“…”有什么必要

这里到底发生了什么,为什么不能自动推断变量??向第三个参数传递额外的“…”有什么必要

Go不会自动推断变量-事实上,Go故意推断的很少,自动推断的很少。您需要
,因为它不能推断。它还清楚地表明,当你把一个切片传递给一个变量时,你是想让它分解,还是想让切片本身成为一个参数;这两种方法都可以是有效的用例,Go希望您明确,而不是做出假设

    selectStmt = 'Select * FROM users where user_id IN (?)'
    selectStmt, userArgs, err := sqlx.In(selectStmt, userIDs)// userIDs is a slice
    if err != nil {
        return nil, errors.Wrap(err, "")
    }

    selectStmt = s.db.Rebind(selectStmt)


    var users []User
        err = s.db.Select(&users, selectStmt, userArgs) // wrong one .. Line A

    err = s.db.Select(&users, selectStmt, userArgs... ) // right one .. Line B