我正在学习GoLang web开发,我正在尝试一个简单的例子,在使用Golang模板渲染的网页上显示mysql数据库中的表。 下面是我的代码片段,它不起作用。表格渲染失败,其中范围功能在模板无法正常工作
Server.go
package main
import (
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
"database/sql"
"os"
"html/template"
)
type Employee struct {
fname, sname, dname, email string
}
func helloWorld(w http.ResponseWriter, r *http.Request){
name, err := os.Hostname()
checkErr(err)
fmt.Fprintf(w, "HOSTNAME : %s\n", name)
}
func dbConnect() (db *sql.DB) {
dbDriver := "mysql"
dbUser := "root"
dbPass := "password"
dbHost := "mysql.go"
dbPort := "3306"
dbName := "company"
db, err := sql.Open(dbDriver, dbUser +":"+ dbPass +"@tcp("+ dbHost +":"+ dbPort +")/"+ dbName +"?charset=utf8")
checkErr(err)
return db
}
func dbSelect() []Employee{
db := dbConnect()
rows, err := db.Query("select * from employees")
checkErr(err)
employee := Employee{}
employees := []Employee{}
for rows.Next() {
var first_name, last_name, department, email string
err = rows.Scan(&first_name, &last_name, &department, &email)
checkErr(err)
employee.fname = first_name
employee.sname = last_name
employee.dname = department
employee.email = email
employees = append(employees, employee)
}
defer db.Close()
return employees
}
var tmpl = template.Must(template.ParseFiles("layout.html"))
//var tmpl = template.Must(template.ParseGlob("layout.html"))
func dbTableHtml(w http.ResponseWriter, r *http.Request){
table := dbSelect()
tmpl.ExecuteTemplate(w, "Index", table)
}
func dbTable(w http.ResponseWriter, r *http.Request){
table := dbSelect()
for i := range(table) {
emp := table[i]
fmt.Fprintf(w,"YESS|%12s|%12s|%12s|%20s|\n" ,emp.fname ,emp.sname ,emp.dname ,emp.email)
}
}
func main() {
http.HandleFunc("/", helloWorld)
http.HandleFunc("/view", dbTableHtml)
http.HandleFunc("/raw", dbTable)
http.ListenAndServe(":8080", nil)
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
的layout.html
{{ define "Index" }}
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Maithanam Website</title>
<meta charset="UTF-8" />
</head>
<body>
<h1>Maithanammm website for mysql</h1>
{{ $length := len . }}
<h3>Length {{$length}}</h3>
<table border="1">
<tr>
<td>FirstName</td>
<td>SecondName</td>
<td>Department</td>
<td>Email</td>
</tr>
{{ range . }}
<tr>
<td>{{ .fname }}</td>
<td> {{ .sname }} </td>
<td>{{ .dname }} </td>
<td>{{ .email }} </td>
</tr>
{{ end }}
</table>
</body>
</html>
{{ end }}
答案 0 :(得分:1)
你有两个问题:
ExecuteTemplate
时,您没有检查错误。对于第一个问题:
err := tmpl.ExecuteTemplate(w, "Index", table)
if err != nil {
// Do something with the error
}
对于第二个问题,请将struct
更改为导出字段:
type Employee struct {
Fname, Sname, Dname, Email string
}
然后更改模板以使用新的字段名称。