我目前构建了一个可工作的golang脚本,但为了连续性,如果我想添加另一个页面,我需要能够从一个单独的函数调用http.HandleFunc
。
我知道这不是一个好的做法,但我是新来的Golang。
我希望能够从一个单独的函数调用主函数的http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request)
部分
以下是代码:
package main
import (
"database/sql"
"fmt"
"html/template"
"net/http"
"strconv"
"github.com/rs/xid"
_ "github.com/go-sql-driver/mysql"
)
func main() {
tmpl := template.Must(template.ParseFiles("Add-Vehicle.html"))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
tmpl.Execute(w, nil)
return
}
db, err := sql.Open("mysql", "root:WgFl3f8218!@tcp(127.0.0.1:3306)/my_db")
if err != nil {
fmt.Println("Connection Failed.")
panic(err.Error())
}
defer db.Close()
id := xid.New()
var brand_ = r.FormValue("select")
var model_ = r.FormValue("select-1")
year_, err := strconv.ParseInt(r.FormValue("year")[0:], 10, 64)
if err != nil {
fmt.Println(err)
}
mileage_, err := strconv.ParseInt(r.FormValue("text")[0:], 10, 64)
if err != nil {
fmt.Println(err)
}
dayrate_, err := strconv.ParseInt(r.FormValue("dayrate")[0:], 10, 64)
if err != nil {
fmt.Println(err)
}
insert, err := db.Query("INSERT INTO vehicle(id, date, brand, model, mileage, manufactured, rented, dayrate) VALUES ( ?, NOW(), ?, ?, ?, ?, 0, ?)", id.String(), brand_, model_, mileage_, year_, dayrate_)
if err != nil {
panic(err.Error())
}
defer insert.Close()
tmpl.Execute(w, struct {
Success bool
Brand string
Model string
Year int64
Mileage int64
Dayrate int64
}{true, brand_, model_, year_, mileage_, dayrate_})
})
http.Handle("/css/", http.StripPrefix("/css", http.FileServer(http.Dir("./css"))))
http.Handle("/js/", http.StripPrefix("/js", http.FileServer(http.Dir("./js"))))
http.Handle("/images/", http.StripPrefix("/images", http.FileServer(http.Dir("./images"))))
http.ListenAndServe(":9090", nil)
}
每当我尝试过其他例子时,我似乎都很难处理模板方面的问题。
您使用的是http。HandleFunc
http.HandleFunc("/", someFunction)
正如@JimB评论的那样,为什么不把它作为一个函数提取出来呢?
func someFunction(w http.ResponseWriter, r *http.Request) {
...
}
func main() {
http.HandleFunc("/", someFunction)
...
}
然而,在阅读您的函数时,您还需要执行大量的DB调用和模板执行,所以我认为您的函数中可能没有这些可用的调用和模板。在这种情况下,您可能希望创建一个结构,该结构上有一个匹配HandleFunc签名或返回HandleFunc的方法。
请参阅此SO应答
Mat Ryer还在《八年后我如何编写Http服务》中概述了这种技术("处理程序挂断服务器"(。
您可以尝试使用光纤库解决此问题。在光纤中,您可以使用应用程序变量app := fiber.New()
创建端点。若您使用指针将这个应用程序变量传递给其他函数,并根据需要在该函数内部创建一个端点。最后开始在主功能上服务这个应用程序。
Fiber的GitHub存储库