Skip to main content

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.goutils.gogo.mod

其中,main.goutils.go都声明了package main,所以它们属于同一个项目,并且共享方法、变量和常量。

启动项目,实质上就是运行main()方法,而这个方法在哪个go文件都可以。

go.mod是用来做包管理的,指定了项目版本号、依赖等。

热重载

使用fresh库,然后命令行输入fresh就会自动运行,在修改时会自动重载。