args ...interface{} 对于方法参数到底意味着什么?

我指的是以下方法,该方法将最后一个参数作为 args ...interfact{})

func (*sqlx.DB).Select(dest interface{}, query string, args ...interface{}) error

https://godoc.org/github.com/jmoiron/sqlx#DB.Select

据我了解,该方法接受任何类型的最后一个参数,该参数是可变参数..

所以

    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



在上述代码中,如果我注释掉 Line B ,但不注释掉 Line A ,则它不起作用。我收到以下错误。


sql: 转换参数 $1 类型: 不支持的类型 []interface {}, 接口的切片 *

问题

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


缥缈止盈
浏览 88回答 1
1回答

慕无忌1623718

这里到底发生了什么,为什么不能自动推断变量?需要向第三个参数传递额外的“...”吗?Go 不会自动推断变量 - 事实上,Go 故意推断得很少,自动执行的操作也很少。您需要它,... 因为它不会推断。它还清楚地表明,当您将切片传递给可变参数时,您是否意味着将其分解,或者意味着切片本身是单个参数;两者都可能是一个有效的用例,Go 不希望你做出假设,而是希望你是明确的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go