首页 > 解决方案 > 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 它不起作用。我收到以下错误。

问题

这里到底发生了什么,为什么不能自动推断可变参数?将额外的 '...' 传递给第三个参数有什么需要?

标签: go

解决方案


这里到底发生了什么,为什么不能自动推断可变参数?将额外的 '...' 传递给第三个参数有什么需要?

Go 不会自动推断可变参数 - 事实上,Go 故意推断很少并且自动执行的很少。你需要,... 因为它不会推断。它还清楚地表明,当您将切片传递给可变参数时,您的意思是要分解它,还是要切片本身是单个参数;两者都可能是一个有效的用例,而不是做出假设,Go 希望你是明确的。


推荐阅读