Я новичок в программировании на Go и пишу функцию для публикации в альтернативном ключе в качестве автоинкрементации первичного ключа с использованием пакетов Go, Mysql и template.HTML.
После устранения неполадок в течение последних нескольких дней я загружаю пустую HTML-страницу.
Буду очень признателен за любые предложения по наилучшей практике или способам устранения неполадок в будущем.
Большое спасибо за любую помощь, которую вы готовы предложить!
Я использовал линтеры и средства форматирования, чтобы убедиться, что код правильно отформатирован, использовал операторы print и перестроил функцию и HTML-контентс нуля, чтобы сузить его.
Обработчик HTTP
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"text/template"
_ "github.com/go-sql-driver/mysql"
)
type watchInfo struct {
ID int
Brand string
}
var (
tpl *template.Template
// cnn, err = sql.Open("mysql", "root:root@tcp(db:3306)/appdb")
)
//function to connect to db
func dbConn() (db *sql.DB) {
dbDriver := "mysql"
dbUser := "root"
dbPass := "root"
dbName := "appdb"
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp"+"(db:3306)/"+dbName)
if err != nil {
fmt.Println("dbConn not work")
}
return db
}
func init() {
tpl = template.Must(template.ParseGlob("/go/templates/*"))
}
func main() {
http.HandleFunc("/", index)
http.HandleFunc("/upload", uploadWatchInfo)
http.ListenAndServe(":8080", nil)
}
//This function get watch id and brand using getWatch function and passes them to the gohtml template file
func index(w http.ResponseWriter, r *http.Request) {
db := dbConn()
defer db.Close()
scanWatches, err := db.Query("SELECT * FROM watches order by id")
if err != nil {
log.Fatal(err)
}
err = db.Ping()
if err != nil {
fmt.Println(err.Error())
}
watch := watchInfo{}
watchSlice := []watchInfo{}
for scanWatches.Next() {
var id int
var brand string
err = scanWatches.Scan(&id, &brand)
if err != nil {
fmt.Println("sW.Scan didn't work")
}
watch.ID = id
watch.Brand = brand
watchSlice = append(watchSlice, watch)
}
tpl.ExecuteTemplate(w, "pic.gohtml", watchSlice)
}
func uploadWatchInfo(w http.ResponseWriter, r *http.Request) {
db := dbConn()
defer db.Close()
if r.Method == "POST" {
brand := r.FormValue("brand")
insForm, err := db.Prepare("INSERT INTO watches(brand) VALUES(?)")
if err != nil {
panic(err.Error)
}
insForm.Exec(brand)
err = tpl.ExecuteTemplate(w, "upload.gohtml", watchInfo{Brand: brand})
if err != nil {
panic(err.Error)
}
}
}
//this is handling an error and can be called in other page functions
func HandleError(w http.ResponseWriter, err error) {
if err != nil {
fmt.Println("Index did not work. error in index")
}
}
Шаблон HTML
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload page</title>
</head>
<body>
<h1>upload page</h1>
<form method="POST" action="insert">
<label> brand </label><input type="text" name="brand"/><br />
<input type="submit" value="Save brand"/>
</form>
<a href="/">Index</a>
</body>
</html>
Я ожидаю, что мой обработчик вставит строковое значение в базу данных и напечатаетподтверждение в терминале.