我正在使用 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 errvals := make([]sql.RawBytes, len(cols)) // Allocate enough valuesints := 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.}来自本教程但它不起作用,我收到了类似的错误cannot use &ints[i] (type *interface {}) as type sql.RawBytes in assignment即使它有效,我也不明白。有没有人对此有好的解决方案?一些解释也会很好。
1 回答
有只小跳蛙
TA贡献1824条经验 获得超8个赞
第一个问题在这里:
for i := range ints {
vals[i] = &ints[i] // Copy references into the slice
}
这是您将要作为 RawBytes 的值设置为接口的指针。
在我解释这意味着什么之前,我会看看我是否可以解释这里的一般想法。
因此,通常在 Go 中从 SQL 获取响应时,每个列和类型(id int,name string,...)都有一个切片,然后您可以将每个 SQL 记录读入该切片,并且每个列都将映射到相同类型的值。
对于像您这样的情况,您将有更多来自 SQL 的响应并且需要 Go 来处理它,您可以这样做:
for i := range ints {
ints[i] = &vals[i] // Copy references into the slice
}
这意味着您的每个interface值都包含一个指向vals数组的指针,该数组将保存来自 SQL 的响应。(在我的示例中,我使用 [][]byte 而不是 RawBytes,因此值 in vals将是来自 SQL 的字节值的一部分。)
然后你会这样做:
err := rows.Scan(ints...)
由于interface可以评估为任何类型,当ints数组被填充时,它将接受任何值,然后根据指针更新 vals 数组中的位置,并将 SQL 中的值作为 RawBytes 类型。
HTH
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消