Golang输出结果不符合预期该如何解决

Golang输出结果不符合预期该如何解决 你好,

我有以下代码:

package main

import (
    "database/sql"
    "log"
    "net/http"
    "text/template"
    _ "github.com/go-sql-driver/mysql"
)

type Kinderen struct {
    nummer     int
    naam       string
    woonplaats string
    leeftijd   string
    zakgeld    string
    kleedgeld  string
    totaal     string
}

func dbConn() (db *sql.DB) {
    dbDriver := "mysql"
    dbUser := "root"
    dbPass := "Studie01"
    dbName := "zakgeld"
    db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
    if err != nil {
        panic(err.Error())
    }
    return db
}

var tmpl = template.Must(template.ParseGlob("form/*"))

func Index(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    selDB, err := db.Query("SELECT * FROM Kinderen ORDER BY nummer DESC")
    if err != nil {
        panic(err.Error())
    }
    emp := Kinderen{}
    res := []Kinderen{}
    for selDB.Next() {
        var nummer int
        var naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal string
        err = selDB.Scan(&nummer, &naam, &woonplaats, &leeftijd, &zakgeld, &kleedgeld, &totaal)
        if err != nil {
            panic(err.Error())
        }
        emp.nummer = nummer
        emp.naam = naam
        emp.woonplaats = woonplaats
        emp.leeftijd = leeftijd
        emp.zakgeld = zakgeld
        emp.kleedgeld = kleedgeld
        emp.totaal = totaal
        res = append(res, emp)
    }
    tmpl.ExecuteTemplate(w, "Index", res)
    defer db.Close()
}

func Show(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    nId := r.URL.Query().Get("nummer")
    selDB, err := db.Query("SELECT * FROM Kinderen WHERE nummer=?", nId)
    if err != nil {
        panic(err.Error())
    }
    emp := Kinderen{}
    res := []Kinderen{}
    for selDB.Next() {
        var naam, woonplaats string
        var leeftijd, zakgeld, kleedgeld, totaal string
        err = selDB.Scan(&naam, &woonplaats, &leeftijd, &zakgeld, &kleedgeld, &totaal)
        if err != nil {
            panic(err.Error())
        }
        emp.naam = naam
        emp.woonplaats = woonplaats
        emp.leeftijd = leeftijd
        emp.zakgeld = zakgeld
        emp.kleedgeld = kleedgeld
        emp.totaal = totaal
        res = append(res, emp)
        tmpl.ExecuteTemplate(w, "Show", emp)
        defer db.Close()
    }
}

func New(w http.ResponseWriter, r *http.Request) {
    tmpl.ExecuteTemplate(w, "New", nil)
}

func Edit(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    nId := r.URL.Query().Get("nummer")
    selDB, err := db.Query("SELECT * FROM Kinderen WHERE nummer=?", nId)
    if err != nil {
        panic(err.Error())
    }
    emp := Kinderen{}
    for selDB.Next() {
        var nummer int
        var naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal string
        err = selDB.Scan(&nummer, &naam, &woonplaats, &leeftijd, &zakgeld, &kleedgeld, &totaal)
        if err != nil {
            panic(err.Error())
        }
        emp.nummer = nummer
        emp.naam = naam
        emp.woonplaats = woonplaats
        emp.leeftijd = leeftijd
        emp.zakgeld = zakgeld
        emp.kleedgeld = kleedgeld
        emp.totaal = totaal
    }
    tmpl.ExecuteTemplate(w, "Edit", emp)
    defer db.Close()
}

func Insert(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    if r.Method == "POST" {
        naam := r.FormValue("naam")
        woonplaats := r.FormValue("woonplaats")
        leeftijd := r.FormValue("leeftijd")
        zakgeld := r.FormValue("zakgeld")
        kleedgeld := r.FormValue("kleedgeld")
        totaal := r.FormValue("totaal")
        insForm, err := db.Prepare("INSERT INTO Kinderen(naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal) VALUES(?,?,?,?,?,?)")
        if err != nil {
            panic(err.Error())
        }
        insForm.Exec(naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal)
        log.Println("INSERT: Naam: " + naam + " | woonplaats: " + woonplaats + " | leeftijd: " + leeftijd + " | zakgeld: " + zakgeld + " | kleedgeld:" + kleedgeld + " | totaal:" + totaal)
    }
    defer db.Close()
    http.Redirect(w, r, "/", 301)
}

func Update(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    if r.Method == "POST" {
        naam := r.FormValue("naam")
        woonplaats := r.FormValue("woonplaats")
        leeftijd := r.FormValue("leeftijd")
        zakgeld := r.FormValue("zakgeld")
        kleedgeld := r.FormValue("kleedgeld")
        totaal := r.FormValue("totaal")
        insForm, err := db.Prepare("UPDATE Kinderen SET naam=?, woonplaats=?, leeftijd=?, zakgeld=?, kleedgeld=?, totaal=? WHERE nummer=?")
        if err != nil {
            panic(err.Error())
        }
        insForm.Exec(naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal)
        log.Println("UPDATE: Naam: " + naam + " | woonplaats: " + woonplaats + " | leeftijd: " + leeftijd + " | zakgeld: " + zakgeld + " | kleedgeld" + kleedgeld)
    }
    defer db.Close()
    http.Redirect(w, r, "/", 301)
}

func Delete(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    emp := r.URL.Query().Get("nummer")
    delForm, err := db.Prepare("DELETE FROM Kinderen WHERE nummer=?")
    if err != nil {
        panic(err.Error())
    }
    delForm.Exec(emp)
    log.Println("DELETE")
    defer db.Close()
    http.Redirect(w, r, "/", 301)
}

func main() {
    log.Println("Server started on: http://localhost:8080")
    http.HandleFunc("/", Index)
    http.HandleFunc("/show", Show)
    http.HandleFunc("/new", New)
    http.HandleFunc("/edit", Edit)
    http.HandleFunc("/insert", Insert)
    http.HandleFunc("/update", Update)
    http.HandleFunc("/delete", Delete)
    http.ListenAndServe(":8080", nil)
}

然而输出结果并不符合我的预期:

image

尽管我已经在数据库的多个列中添加了信息,但只有第一列显示了一条线。

代码哪里出错了?


更多关于Golang输出结果不符合预期该如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

谢谢!

更多关于Golang输出结果不符合预期该如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用三个反引号```而不是撇号,这样效果会更好…

使用 MySQL Workbench 或类似工具检查数据库,如果数据看起来正常,可能是您的模板没有按预期工作。

请使用Markdown格式化您的代码,当前格式难以阅读

fmt.Frpintf("Put your code here")

像这样

fmt.Fprintf("Put your code here")

还有一件事,或者可能是两件

  1. 删除第一行或将其设为注释,它会导致代码运行异常

    fmt.Frpintf (" Version:1.0 StartHTML:000000222 EndHTML:000012168 StartFragment:000006027 EndFragment:000012028 StartSelection:000006030 EndSelection:000012024 SourceURL:https://forum.golangbridge.org/t/output-not-as-i-want/11535
    
  2. 如果代码能进行缩进格式化就更好了。也许缩进没有显示是因为上述问题。否则,你可以简单地通过将代码粘贴到 Go Playground 并按下“Format”按钮来很好地格式化你的代码。就像这样:https://play.golang.org/p/KC8EOdBg34t 我不得不将一些 & 改为仅仅的 &

你的代码中存在几个问题导致输出不符合预期。主要问题是在Index函数中,你重复使用了同一个emp变量,导致切片中的所有元素都指向同一个内存地址,最终显示的是最后一条记录的数据。

以下是修复后的代码:

func Index(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    defer db.Close() // defer应该放在函数开始处
    
    selDB, err := db.Query("SELECT * FROM Kinderen ORDER BY nummer DESC")
    if err != nil {
        panic(err.Error())
    }
    defer selDB.Close()
    
    res := []Kinderen{}
    for selDB.Next() {
        var nummer int
        var naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal string
        err = selDB.Scan(&nummer, &naam, &woonplaats, &leeftijd, &zakgeld, &kleedgeld, &totaal)
        if err != nil {
            panic(err.Error())
        }
        // 每次循环创建新的Kinderen实例
        emp := Kinderen{
            nummer:     nummer,
            naam:       naam,
            woonplaats: woonplaats,
            leeftijd:   leeftijd,
            zakgeld:    zakgeld,
            kleedgeld:  kleedgeld,
            totaal:     totaal,
        }
        res = append(res, emp)
    }
    tmpl.ExecuteTemplate(w, "Index", res)
}

Show函数也有类似问题,修复如下:

func Show(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    defer db.Close()
    
    nId := r.URL.Query().Get("nummer")
    selDB, err := db.Query("SELECT * FROM Kinderen WHERE nummer=?", nId)
    if err != nil {
        panic(err.Error())
    }
    defer selDB.Close()
    
    if selDB.Next() {
        var nummer int
        var naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal string
        err = selDB.Scan(&nummer, &naam, &woonplaats, &leeftijd, &zakgeld, &kleedgeld, &totaal)
        if err != nil {
            panic(err.Error())
        }
        emp := Kinderen{
            nummer:     nummer,
            naam:       naam,
            woonplaats: woonplaats,
            leeftijd:   leeftijd,
            zakgeld:    zakgeld,
            kleedgeld:  kleedgeld,
            totaal:     totaal,
        }
        tmpl.ExecuteTemplate(w, "Show", emp)
    }
}

Update函数缺少nummer参数:

func Update(w http.ResponseWriter, r *http.Request) {
    db := dbConn()
    defer db.Close()
    
    if r.Method == "POST" {
        nummer := r.FormValue("nummer")
        naam := r.FormValue("naam")
        woonplaats := r.FormValue("woonplaats")
        leeftijd := r.FormValue("leeftijd")
        zakgeld := r.FormValue("zakgeld")
        kleedgeld := r.FormValue("kleedgeld")
        totaal := r.FormValue("totaal")
        
        insForm, err := db.Prepare("UPDATE Kinderen SET naam=?, woonplaats=?, leeftijd=?, zakgeld=?, kleedgeld=?, totaal=? WHERE nummer=?")
        if err != nil {
            panic(err.Error())
        }
        insForm.Exec(naam, woonplaats, leeftijd, zakgeld, kleedgeld, totaal, nummer)
        log.Println("UPDATE: Naam: " + naam + " | woonplaats: " + woonplaats + " | leeftijd: " + leeftijd + " | zakgeld: " + zakgeld + " | kleedgeld" + kleedgeld)
    }
    http.Redirect(w, r, "/", 301)
}

主要修改点:

  1. 在循环中每次创建新的Kinderen实例,避免引用同一内存地址
  2. 正确使用defer关闭数据库连接
  3. 修复Update函数中缺失的nummer参数
  4. 添加对查询结果集的关闭操作

这些修改应该能解决你的输出问题。

回到顶部