go - 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 {},接口切片 *
问题
这里到底发生了什么,为什么不能自动推断可变参数?将额外的 '...' 传递给第三个参数有什么需要?
解决方案
这里到底发生了什么,为什么不能自动推断可变参数?将额外的 '...' 传递给第三个参数有什么需要?
Go 不会自动推断可变参数 - 事实上,Go 故意推断很少并且自动执行的很少。你需要,...
因为它不会推断。它还清楚地表明,当您将切片传递给可变参数时,您的意思是要分解它,还是要切片本身是单个参数;两者都可能是一个有效的用例,而不是做出假设,Go 希望你是明确的。
推荐阅读
- python - 使用 Python 从 Azure 表存储中的表中获取最旧的 n 行
- excel - 意外的日期结果 - Excel VBA - 日月年混淆
- ssl - SEC_ERROR_REVOKED_CERTIFICATE 错误仅在 PC Firefox 上
- macos - 如何标准化指向 APFS 卷组成员的路径
- react-native - 带有 React Native 的键盘和模式(UI Kitten)
- java - Spring boot JpaRepository manytomany findBy 包含列表参数中的所有值
- apache-superset - 如何将 SuperSet UI 集成到 React 应用程序中
- linux - 有没有办法通过linux命令将ruby文件中的变量“gitlab_rails['omniauth_enabled']=false更改为“true”
- algorithm - 覆盖 n 个点的最小圆数
- elasticsearch - 通过特定字段搜索时,ElasticSearch 不返回任何结果