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 int
zakgeld int
kleedgeld int
totaal int
}

func dbConn() (db *sql.DB) {
dbDriver := "mysql"
dbUser := "root"
dbPass := "######"
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 string
var leeftijd, zakgeld, kleedgeld, totaal int
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{}
for selDB.Next() {
var nummer int
var naam, woonplaats string
var leeftijd, zakgeld, kleedgeld, totaal int
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, "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 string
var leeftijd, zakgeld, kleedgeld, totaal int
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")
insForm, err := db.Prepare("INSERT INTO Kinderen(naam, woonplaats, leeftijd, zakgeld, kleedgeld) VALUES(?,?,?,?,?)")
if err != nil {
panic(err.Error())
}
insForm.Exec(naam, woonplaats)
log.Println("INSERT: Naam: " + naam + " | woonplaats: " + woonplaats + " | leeftijd: " + leeftijd + " | zakgeld: " + zakgeld + " | kleedgeld" + kleedgeld)
}
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")
nummer := r.FormValue("nummer")
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)
}
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)
}

当我运行这段代码时,遇到了一个我无法理解的语法错误:

.\main.go:94:7: syntax error: unexpected New, expecting (
.\main.go:98:7: syntax error: unexpected Edit, expecting (
.\main.go:126:7: syntax error: unexpected Insert, expecting (
.\main.go:145:7: syntax error: unexpected Update, expecting (
.\main.go:166:7: syntax error: unexpected Delete, expecting (
.\main.go:179:7: syntax error: unexpected main, expecting (
Error: process exited with code 2.

有人对此有什么想法吗?


更多关于Golang语法错误排查:这个报错原因我实在搞不懂的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢! 我能够继续了!!!

更多关于Golang语法错误排查:这个报错原因我实在搞不懂的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,

你看到的这些错误都是因为顶部的 Show() 函数没有用右大括号 “}” 正确闭合。

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{}
   
   for selDB.Next() {

      var nummer int

      var naam, woonplaats string

      var leeftijd, zakgeld, kleedgeld, totaal int

      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, "Show", emp)

      defer db.Close()

   }  // 这里闭合的是 for 循环,而不是 Show() 函数

因此,其他所有函数的定义都变得混乱了。

我想建议你尝试使用缩进。当你进入 if 语句、循环或函数时,使用制表符空格,这样你就能正确识别开始和结束的大括号。

希望这能帮到你!

你的代码中存在几个函数定义语法错误,主要是缺少函数参数列表的括号。在Go语言中,即使函数没有参数,也必须包含空括号()

以下是需要修正的函数定义:

// 错误:func New (w http.ResponseWriter, r *http.Request) {
// 正确:
func New(w http.ResponseWriter, r *http.Request) {
    tmpl.ExecuteTemplate(w, "New", nil)
}

// 错误:func Edit (w http.ResponseWriter, r *http.Request) {
// 正确:
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 string
        var leeftijd, zakgeld, kleedgeld, totaal int
        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) {
// 正确:
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")
        insForm, err := db.Prepare("INSERT INTO Kinderen(naam, woonplaats, leeftijd, zakgeld, kleedgeld) VALUES(?,?,?,?,?)")
        if err != nil {
            panic(err.Error())
        }
        insForm.Exec(naam, woonplaats, leeftijd, zakgeld, kleedgeld)
        log.Println("INSERT: Naam: " + naam + " | woonplaats: " + woonplaats + " | leeftijd: " + leeftijd + " | zakgeld: " + zakgeld + " | kleedgeld: " + kleedgeld)
    }
    defer db.Close()
    http.Redirect(w, r, "/", 301)
}

// 错误:func Update (w http.ResponseWriter, r *http.Request) {
// 正确:
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")
        nummer := r.FormValue("nummer")
        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)
    }
    defer db.Close()
    http.Redirect(w, r, "/", 301)
}

// 错误:func Delete (w http.ResponseWriter, r *http.Request) {
// 正确:
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 {
// 正确:
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)
}

另外,我还注意到你的代码中还有其他问题:

  1. Show函数中,res变量未定义:
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{}
    for selDB.Next() {
        var nummer int
        var naam, woonplaats string
        var leeftijd, zakgeld, kleedgeld, totaal int
        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, "Show", emp)
    defer db.Close()
}
  1. Insert函数中,insForm.Exec的参数数量与占位符不匹配,应该传递5个参数而不是2个。

修正这些语法错误后,你的代码应该能够正常编译。

回到顶部