Golang中如何将SQL查询结果追加到数组
Golang中如何将SQL查询结果追加到数组 我的结构如下:
type Year struct {
Yname string
}
type Data struct {
Years []*Year
}
以及一个查询:
selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly ORDER BY report_monthly_id DESC")
if err != nil {
panic(err.Error())
}
for selDB1.Next() {
var years string
err = selDB1.Scan(&years)
if err != nil {
panic(err.Error())
}
如何将SQL结果集追加到数组(res)中? 之后我执行一个模板:
tmpl.ExecuteTemplate(w, "IndexReport", res)
在我的模板中我想要实现:
{{range .Years}}
YEAR IS: {{.Yname}}
{{end}}
更多关于Golang中如何将SQL查询结果追加到数组的实战教程也可以访问 https://www.itying.com/category-94-b0.html
TSTSTS:
我正在编写这段代码但遇到了错误
具体是什么错误?
另外,res 是一个结构体,你不能直接对它进行追加操作。你需要对其 Years 字段进行追加。
更多关于Golang中如何将SQL查询结果追加到数组的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
正如你总是在切片上进行追加操作……在循环中使用 s := append(s, years)。
func main() {
s := []int{1, 2, 3}
years := 4
s = append(s, years)
fmt.Println(s)
}
感谢 @NobbZ,以下是完整代码。除了提到的代码部分外,其他一切运行正常。
我只需要将两个不同结构的数组发送到模板……这花了我很多天时间,现在真的卡在这里了……
func main() {
fmt.Println("hello world")
}
我的情况有点复杂,我写了这段代码但一直报错:我是Go语言新手。能帮帮我吗?
res := Data{}
selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly ORDER BY report_monthly_id DESC")
if err != nil {
panic(err.Error())
}
for selDB1.Next() {
var years string
err = selDB1.Scan(&years)
if err != nil {
panic(err.Error())
}
f1 := Year{Yname: years}
res = append(res, f1)
}
你发布的代码似乎不是完整的文件,至少缺少包声明和导入语句,因此我们无法确定确切的代码行号。
不过我认为引用的错误信息指的是这两行代码:
person := Data{Years: []*Year{&res},
Months: []*Month{&resm}}
res 的类型是 []Year,resm 的类型是 []Month。
[]*Year{&res} 试图创建一个 *Year 类型的切片,其中包含单个元素 &res,而 &res 的类型是 *[]Year,这两者类型不匹配。
看起来你需要重新考虑如何设置类型和中间表示形式,特别要注意确保它们能够相互匹配。
抱歉信息不够完整,上面是完整的代码。如您所见,我有两个查询,它们的结果集已成功添加到 res 和 resm 数组中。然后我想将它们添加到 person 结构体中,并将其发送到 IndexReport 模板。这就是我期望得到的结果…
我遇到的错误与 person 结构体有关:
[root[@abc](/user/abc) report_m]# go run main.go # command-line-arguments ./main.go:132:36: cannot use &res (type *[]Year) as type *Year in array or slice literal ./main.go:133:37: cannot use &resm (type *[]Month) as type *Month in array or slice literal [root[@abc](/user/abc) report_m]#
这里我需要帮助,先谢谢了。
TSTSTS:
./main.go:129:21: append 的第一个参数必须是切片;实际类型为 struct { Yname string; Selected bool }
./main.go:133:17: 未定义: f1
我不确定这些行号如何对应到你提供的代码,所以只能猜测。
第129行可能是 res = append(res, f1),我在上一篇文章中已经解释过为什么这行不通。错误信息也确实明确指出了这一点。
第133行可能是 log.Println(f1),当你执行到这一行时,f1 并不在作用域内,因为它只在循环体的最后两行中定义。
编辑
你希望 res 实际具有什么类型?是 Data 类型还是 []Year 类型?
如果是前者,应该是 res.Years = append(res.Years, &years);如果是后者,应该是 res = append(res, years),但你需要使用 res := make([]Year, 0) 而不是 res := Year{}。
func main() {
fmt.Println("hello world")
}
感谢NobbZ,当我运行代码时遇到了错误:
# command-line-arguments
./main.go:129:21: append的第一个参数必须是切片;当前是struct { Yname string; Selected bool }
./main.go:133:17: f1未定义
这是我的代码: 你能帮我看看并给出专业意见吗,我哪里做错了…
func ShowMonth(w http.ResponseWriter, r *http.Request) {
db := dbConn()
res := Year{}
selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly ORDER BY report_monthly_id DESC")
if err != nil {
panic(err.Error())
}
for selDB1.Next() {
var years string
err = selDB1.Scan(&years)
if err != nil {
panic(err.Error())
}
f1 := Year{Yname: years}
res = append(res, f1)
}
log.Println(f1)
// tmpl3.ExecuteTemplate(w, "IndexReport", f1)
defer db.Close()
}
您需要创建一个Data实例,然后在循环中将每个查询结果作为Year指针追加到Years切片中。以下是完整的解决方案:
type Year struct {
Yname string
}
type Data struct {
Years []*Year
}
func main() {
// 创建Data实例
res := &Data{
Years: make([]*Year, 0),
}
selDB1, err := db.Query("SELECT DISTINCT YEAR(Rdate) as years FROM report_monthly ORDER BY report_monthly_id DESC")
if err != nil {
panic(err.Error())
}
defer selDB1.Close()
for selDB1.Next() {
var years string
err = selDB1.Scan(&years)
if err != nil {
panic(err.Error())
}
// 创建Year实例并追加到切片中
year := &Year{Yname: years}
res.Years = append(res.Years, year)
}
// 检查循环中的错误
if err = selDB1.Err(); err != nil {
panic(err.Error())
}
// 执行模板
tmpl.ExecuteTemplate(w, "IndexReport", res)
}
您的模板代码是正确的,可以直接使用:
{{range .Years}}
YEAR IS: {{.Yname}}
{{end}}
这样,查询结果中的每个年份都会作为Year对象存储在res.Years切片中,模板可以正确遍历并显示每个年份的Yname字段。


