mysql – 如何在Go中构建类型接口的varidics?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 如何在Go中构建类型接口的varidics?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2178字,纯文字阅读大概需要4分钟。
内容图文
![mysql – 如何在Go中构建类型接口的varidics?](/upload/InfoBanner/zyjiaocheng/893/fa61b9065e67467280300fd0022353a9.jpg)
我正在动态构建mysql查询(由于mysql IN子句)所以我需要传递一个参数列表,因为sql.Query函数需要.知道如何做到这一点?我真的不明白可变参数类型是如何工作的,或者我如何“生成”它.如果我传递一个切片,那么sql会抱怨只有一个参数而不是len(在子句params中),因此我只能假设该函数将切片视为参数而不是参数的列表(可变参数).
我的查询/代码
var carsa []string
q := `SELECT field1,field2 FROM cooltable WHERE nicecars IN(?` + strings.Repeat(",?", len(ha.cars)-1) + ")"
hs := strings.Join(carsa, "','")
hs = "'" + hs + "'"
rows, err := cx.Query(q, country, hs)
sql查询
func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
编辑:我正在尝试运行的实际代码失败,错误sql:转换Exec参数#0的类型:unsupported type [] interface {},一个切片
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
argsS := []string{"apple", "greph", "3rd"}
db, err := sql.Open("mysql", dbUser+":"+dbPass+"@tcp("+dbHost+":3306)/"+dbName)
if err != nil {
return
}
query := `SELECT id,label FROM fruits WHERE country=? AND stack IN(?` + strings.Repeat(",?", len(args)-1) + ")"
args := make([]interface{}, len(ha))
args["country"] = interface{}("France")
for i, v := range query {
args[i] = interface{}(v)
}
rows, err := db.Query(q, args...)
if err != nil {
return
}
var id, label string
for rows.Next() {
if err = rows.Scan(&id, label); err != nil {
fmt.Printf("%v", err)
}
}
}
解决方法:
使用给定的函数,您可以使用变量参数列表调用它:
var query string
var args []interface{}
// initialise variables
cx.Query(query, args...)
这相当于调用Query作为单独的参数传递的args切片中的每个元素,as described in the language specification.还要注意切片的类型需要与可变参数函数定义匹配(因此在本例中是一个接口{}的切片.
另请注意,切片需要表示整个可变参数列表.因此,例如,调用cx.Query(q,country,hs …)会出错.在这种情况下,您需要构造一个包含您想要传递的所有参数的切片.
继问题的更新之后,要将固定参数与变量参数结合起来,您希望代码看起来像这样:
stacks := []string{"apple", "greph", "3rd"}
query := `SELECT id,label FROM fruits WHERE country=? AND stack IN(?` + strings.Repeat(",?", len(stacks)-1) + ")"
args := make([]interface{}, len(stacks)+1)
args[0] = "France"
for i := range stacks {
args[i+1] = stacks[i]
}
rows, err := cx.Query(query, args...)
内容总结
以上是互联网集市为您收集整理的mysql – 如何在Go中构建类型接口的varidics?全部内容,希望文章能够帮你解决mysql – 如何在Go中构建类型接口的varidics?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。