gpt4 book ai didi

mysql - 如何在 Go 中构建类型接口(interface)的变量?

转载 作者:IT王子 更新时间:2023-10-29 00:59:45 24 4
gpt4 key购买 nike

我正在动态构建 mysql 查询(由于 mysql IN 子句)所以我需要传递一个参数列表作为 sql.Query功能需要。知道怎么做吗?我真的不明白可变参数类型是如何工作的或者我如何“生成”它。如果我传递一个 slice ,sql 会提示只有一个参数而不是 len(in clause params) 因此我只能假设该函数将 slice 视为参数而不是列表(可变参数)参数。

我的查询/代码

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: converting Exec argument #0's type: unsupported type []interface {}, a slice

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 slice 中的每个元素作为单独的参数传递,as described in the language specification .另请注意, slice 的类型需要与可变参数函数定义相匹配(因此在本例中是 interface{} 的 slice 。

另请注意, slice 需要表示整个可变参数列表。例如,调用 cx.Query(q, country, hs...) 是错误的。在这种情况下,您将需要构造一个 slice 来保存您要传递的所有参数。


根据问题的更新,将固定参数与可变参数结合起来,您希望代码看起来像这样:

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 中构建类型接口(interface)的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24878264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com