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
就会自动运行,在修改时会自动重载。