为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
缥缈止盈 2023-07-17 17:54:02
我指的是以下方法,该方法将最后一个参数作为 args ...interfact{})func (*sqlx.DB).Select(dest interface{}, query string, args ...interface{}) errorhttps://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 {}, 接口的切片 *问题这里到底发生了什么,为什么不能自动推断变量?需要向第三个参数传递额外的“...”吗?
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信