-1

我有一个类似这个例子的 sql select 语句:

queryValues = make([]interface{}, 0, 5)

queryValues = append(Name, obj.Name)
queryValues = append(Age, obj.Age)
whereClause := "where name = $1 and age = $2"    

query := fmt.Sprintf("Select * from Table1  %s;", whereClause)

rows, err := dbConnection.Query(query, queryValues...)

我在这里有几个问题。queryValues 之后的 ... 是什么?当我查看传递给数据库的查询时,为什么没有 $1 实际上被转换为实际值?

我可以运行什么打印函数来模拟 dbConnection.Query(query, queryValues...) 以便在传递之前可以看到它?

提前致谢。

乔什

4

1 回答 1

0

您的第一个问题的答案是 Query 是所谓的可变参数函数https://golang.org/ref/spec#Function_types。它接受任意数量的最后一种类型的参数,并作为切片传递给函数。

queryValues... 与此相反。它正在获取您的切片并将它们作为单独的参数传递给查询。它做的事情和你做的一样:

dbConnection.Query(query, queryValues[0], queryValues[1])

https://golang.org/ref/spec#Passing_arguments_to_..._parameters

在这种特殊情况下,您不需要 []interface{}

dbConnection(query, obj.Name, obj.Age)

您的 $1、$2 占位符未转换的原因可能是因为您为正在使用的特定驱动程序使用了错误的占位符。这取决于驱动程序本身。例如 MySQL 驱动程序使用 '?' 因为它是占位符。

于 2015-06-08T16:59:31.950 回答