go入门
弄了一个入门的路由案例。
基础返回
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", index_handler)
http.ListenAndServe(":8000", nil)
}
http库可以构建路由。http.HandleFunc可以捕获前端访问的路径,并且用一个回调函数来接收。
func index_handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello")
}
和js一样,俩参数一个是写入器,一个是路由请求。fmt.Fprintf可以返回纯文本信息。
返回 Json
func main() {
http.HandleFunc("/", index_handler)
http.HandleFunc("/about", about_handler)
http.ListenAndServe(":8000", nil)
}
首先要定义Json的数据结构。
// 在ID字段的json的注释中写成小写并不影响解析
type Animal struct {
ID int `json:"id"`
Name string `json:"name"`
Order string `json:"order"`
}
这里的注释似乎是可以让程序忽略 key 的大小写。
接着从文本转化到Json
var jsonBlob = []byte(`[
{"name": "Platypus", "order": "Monotremata", "ID":1},
{"name": "Quoll", "order": "Dasyuromorphia", "ID":2}
]`)
func parseJson() []Animal {
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v\n", animals)
return animals
}
最后返回到回调函数。注意这里返回Json依旧是返回的byte格式。
func about_handler(w http.ResponseWriter, r *http.Request) {
ret_json, _ := json.Marshal(parseJson()[0])
// io.WriteString(w, string(ret_json))
// 下面这个也可以
fmt.Fprint(w, string(ret_json))
}
项目组织
现在有一个项目,main.go和utils.go和go.mod
其中,main.go和utils.go都声明了package main,所以它们属于同一个项目,并且共享方法、变量和常量。
启动项目,实质上就是运行main()方法,而这个方法在哪个go文件都可以。
go.mod是用来做包管理的,指定了项目版本号、依赖等。
热重载
使用fresh库,然后命令行输入fresh就会自动运行,在修改时会自动重载。