Go语言后端记录

Posted by xnchen on May 12, 2021

[TOC]

摘要

在大致过了一遍前端语法之后,使用Go作为后端来实现web编程

参考教程:Go Web编程

GoLand配置Mysql数据库

REST

RESTful:REpresentational State Transfer

(1)每个URI代表一种资源;

(2)服务器和客户端之间,传递这种资源的表现层;

(3)客户端通过四个HTTP操作(GET、POST、PUT、DELETE),对服务器端资源进行操作,实现“表现层状态转化”。

imgimg

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数据类型的对应

image

数据库中NULL值的问题

使用sql.Null***类型来解决(如,sql.NullInt64) sql.Null***在sql库中声明如下,在读取时,(比如读取的值存储到NullInt64),假如发现存储的值是NULL,则会将NullInt64的valid设置为false,然后不会将值存储到Int64中,Int64值默认为0,如果是NullString则String值时nil;如果是正常值,则会将Valid赋值为true,将值存储到Int64中。