搭建Go Web服务器遇语法错误:unexpected semicolon or newline before {
解决Go Web服务器的语法错误及相关问题
1. 修复func main()的大括号位置错误
Go语言语法强制要求函数声明的左大括号{必须和函数签名(func main())在同一行,不能单独换行。你的代码中把{放在下一行后,Go的自动分号插入机制会在func main()末尾自动添加分号,直接触发unexpected semicolon or newline before {错误。
修复后的main函数开头:
func main() { // 原有代码逻辑 }
2. 修复http.ListenAndServe的端口参数错误
http.ListenAndServe的第一个参数需要是字符串类型的地址(格式为":端口号"),你传入的数字8080会导致类型不匹配错误。
修复后的代码行:
if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) }
3. 修复helloHandler中的状态码误用
当请求方法不是GET时,应返回405 Method Not Allowed而非404,这是HTTP状态码的标准用法:
if r.Method != "GET" { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return }
4. 修复formHandler中的if语句语法错误
你写的if err != r.ParseForm(); err != nil完全不符合Go的语法规范,正确写法是通过短变量声明捕获ParseForm()的返回错误:
if err := r.ParseForm(); err != nil { fmt.Fprintf(w, "ParseForm() err: %v", err) return }
完整修复后的代码
package main import ( "fmt" "log" "net/http" ) func main() { fileServer := http.FileServer(http.Dir("./static")) http.Handle("/", fileServer) http.HandleFunc("/form", formHandler) http.HandleFunc("/hello", helloHandler) fmt.Printf("Starting Server at port 8080\n") if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } } func helloHandler(w http.ResponseWriter, r *http.Request){ if r.URL.Path != "/hello"{ http.Error(w, "404 not found", http.StatusNotFound) return } if r.Method != "GET" { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return } fmt.Fprintf(w, "hello!") } func formHandler(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { fmt.Fprintf(w, "ParseForm() err: %v", err) return } fmt.Fprintf(w, "POST request successful\n") name := r.FormValue("name") address := r.FormValue("address") fmt.Fprintf(w, "Name = %s\n", name) fmt.Fprintf(w, "Address = %s\n", address) }
内容的提问来源于stack exchange,提问作者CodeX-HH
相关产品推荐
相关产品推荐

