Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang服务器:发送JSON,其中包含具有可变列数的SQL查询结果_Sql_Json_Go - Fatal编程技术网

Golang服务器:发送JSON,其中包含具有可变列数的SQL查询结果

Golang服务器:发送JSON,其中包含具有可变列数的SQL查询结果,sql,json,go,Sql,Json,Go,我正在用Go服务器创建RESTful API的一个小实现 我正在从URL中提取查询参数(我知道这不安全,稍后我会尝试解决这个问题,但如果您对这个主题有任何建议,它们会很有帮助) 我在3个sring变量中保存了表名、所需列和一些条件。 我正在使用此查询: rows, _ := db.Query(fmt.Sprintf("SELECT %s FROM %s WHERE %s", columns, table, conditions)) 我想将查询结果作为JSON发送回我的前端。我有可变数量的未知列

我正在用Go服务器创建RESTful API的一个小实现

我正在从URL中提取查询参数(我知道这不安全,稍后我会尝试解决这个问题,但如果您对这个主题有任何建议,它们会很有帮助)

我在3个sring变量中保存了表名、所需列和一些条件。 我正在使用此查询:

rows, _ := db.Query(fmt.Sprintf("SELECT %s FROM %s WHERE %s", columns, table, conditions))
我想将查询结果作为JSON发送回我的前端。我有可变数量的未知列,所以我不能用“标准”的方式。 我能想到的一个解决方案是从查询结果和rows.Columns()中“手动”构建JSON字符串

但我想用一种更实际的方式来做这件事,比如使用变量接口之类的东西。问题是,即使尝试了很多,我仍然不明白它是如何工作的

我尝试使用以下代码

cols, err := rows.Columns()             // Get the column names; remember to check err
vals := make([]sql.RawBytes, len(cols)) // Allocate enough values
ints := make([]interface{}, len(cols))  // Make a slice of []interface{}
for i := range ints {
    vals[i] = &ints[i] // Copy references into the slice
}
for rows.Next() {
    err := rows.Scan(vals...)
    // Now you can check each element of vals for nil-ness,
    // and you can use type introspection and type assertions
    // to fetch the column into a typed variable.
}
但它不起作用,我得到的错误如下

无法将&ints[i](type*接口{})用作赋值中的sql.RawBytes类型

即使它能起作用,我也不明白

有人有好的解决办法吗?一些解释也很好


非常感谢。

第一个问题是:

i:=范围整数的
{
vals[i]=&ints[i]//将引用复制到切片中
}

这是您设置要作为接口指针的RawBytes值

在我解释这意味着做什么之前,我会看看我是否能解释一下这里的总体想法

因此,通常在Go中从SQL获取响应时,每个列和类型(id int,name string,…)都有一个切片,这样就可以将每个SQL记录读入该切片,并且每个列都将映射到相同类型的值

对于像您这样的情况,您将从SQL获得更多的响应,并且需要处理它,您可以这样做:

i:=范围整数的
{
ints[i]=&vals[i]//将引用复制到切片中
}

这意味着每个
接口
值都有一个指向
vals
数组的指针,该数组将保存来自SQL的响应。(在我的示例中,我使用[][]字节而不是RawBytes,因此
vals
中的值将是来自SQL的字节值片段。)

然后你会做:

err:=行。扫描(ints…)

由于
接口
可以计算为任何类型,因此当填充
ints
数组时,它将接受任何值,然后根据指针将SQL中的值作为RawBytes类型更新VAL数组中的位置