用Golang构建一个小型在线问卷系统并不复杂,核心是用net/http包提供页面与接口,再把用户提交的内容保存下来。下面直接看实现方式。

项目结构与基本思路
我们做一个单文件可运行的小系统,包含三个功能:访问首页看到问卷表单、提交表单后服务端接收、把结果暂存到内存切片里。生产环境可换数据库,但小型系统用内存或文件足够。
需要的依赖
- Go标准库 net/http 提供路由与服务器
- html/template 用于渲染问卷页面
- 无需第三方框架也能完成
实现问卷页面与提交接口
下面代码展示如何用Go起服务,处理GET显示表单和POST保存答案。注意表单里的 <input> 标签名称要在模板里正确写出。
package main
import (
"html/template"
"net/http"
"sync"
)
type Answer struct {
Name string
Like string
Suggest string
}
var (
answers []Answer
mu sync.Mutex
tpl = template.Must(template.New("q").Parse(`
<!DOCTYPE html>
<html><body>
<h2>小问卷</h2>
<form method="POST" action="/submit">
姓名:<input name="name" /><br/>
喜欢Go吗:<input name="like" /><br/>
建议:<input name="suggest" /><br/>
<button type="submit">提交</button>
</form>
</body></html>
`))
)
func index(w http.ResponseWriter, r *http.Request) {
tpl.Execute(w, nil)
}
func submit(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Redirect(w, r, "/", http.StatusSeeOther)
return
}
r.ParseForm()
a := Answer{
Name: r.FormValue("name"),
Like: r.FormValue("like"),
Suggest: r.FormValue("suggest"),
}
mu.Lock()
answers = append(answers, a)
mu.Unlock()
w.Write([]byte("提交成功"))
}
func main() {
http.HandleFunc("/", index)
http.HandleFunc("/submit", submit)
http.ListenAndServe(":8080", nil)
}
代码说明
在 submit() 函数中,我们调用 r.ParseForm() 来解析表单,再用 FormValue() 取值。函数调用不要写成标签形式,例如 FormValue() 就是普通方法调用。
如何查看收集结果
可以再加一个路由把内存里的 answers 打印出来,方便确认数据。下面给出简单扩展:
func list(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
for _, a := range answers {
w.Write([]byte(a.Name + " | " + a.Like + " | " + a.Suggest + "n"))
}
}
// 在 main 中加:
// http.HandleFunc("/list", list)
小结
以上就用Golang搭出了一个能填能收的小型在线问卷系统。想持久化可以把 answers 写文件或接SQLite。掌握这些基础后,你能更快做类似小工具。