[TOC]
摘要
在大致过了一遍前端语法之后,使用Go作为后端来实现web编程
REST
RESTful:REpresentational State Transfer
(1)每个URI代表一种资源;
(2)服务器和客户端之间,传递这种资源的表现层;
(3)客户端通过四个HTTP操作(GET、POST、PUT、DELETE),对服务器端资源进行操作,实现“表现层状态转化”。
HTTP包
http.HandlFunc()方法
设置访问路由
import (
"fmt"
"net/http"
"log"
)
func fooHandler(w http.ResponseWriter, r *http.Request){
if r.Method == "Get" {
t, _ := template.ParseFiles("mainPage.html")
log.Println(t.Excute(w, nil))
}
}
func main() {
http.HandleFunc("/foo", fooHandler) // 设置访问路由
if err := http.ListenAndServer(":8080", nil); err!=nil {
log.Fatal("ListenAndServer: ", err)
} // 设置监听端口
}
但是http包自带的路由有以下几个限制:
- 不支持参数设定,例如/user/:uid 这种泛类型匹配,
- 无法很好的支持REST模式,无法限制访问的方法,例如上面的例子中,用户访问/foo,可以用GET、POST、DELETE、HEAD等方式访问
在教程中,使用了第三方库github.com/julienschmidt/httprouter
的路由,这个库实现了自定义路由和方便的路由规则映射
import (
"fmt"
"log"
"net/http"
"github.com/julienschmidt/httprouter"
)
func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
fmt.Fprint(w, "Welcome!\n")
}
func getuser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
uid := ps.ByName("uid")
fmt.Fprintf(w, "you are get user %s", uid)
}
func modifyuser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
uid := ps.ByName("uid")
fmt.Fprintf(w, "you are modify user %s", uid)
}
func deleteuser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
uid := ps.ByName("uid")
fmt.Fprintf(w, "you are delete user %s", uid)
}
func adduser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
// uid := r.FormValue("uid")
uid := ps.ByName("uid")
fmt.Fprintf(w, "you are add user %s", uid)
}
func main() {
router := httprouter.New()
router.GET("/", Index)
router.GET("/user/:uid", getuser)
router.POST("/adduser/:uid", adduser)
router.DELETE("/deluser/:uid", deleteuser)
router.PUT("/moduser/:uid", modifyuser)
log.Fatal(http.ListenAndServe(":8080", router))
}
Go操作Mysql
Go与Mysql数据类型的对应
数据库中NULL值的问题
使用sql.Null***
类型来解决(如,sql.NullInt64)
sql.Null***
在sql库中声明如下,在读取时,(比如读取的值存储到NullInt64),假如发现存储的值是NULL,则会将NullInt64的valid设置为false,然后不会将值存储到Int64中,Int64值默认为0,如果是NullString则String值时nil;如果是正常值,则会将Valid赋值为true,将值存储到Int64中。