go的开始/自动重载代码
go 编码开始
如何创建go 的项目
一般我们会把项目放置于 $GOPATH/src 目录下
go
cd $GOPATH/src
mkdir goblog
cd goblog
如何使用go run
命令运行go程序
创建main.go 文件
右击新建文件:
main.go
go
package main
import (
"fmt"
"net/http"
)
func handlerFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<h1>Hello, world</h1>")
}
func main() {
http.HandleFunc("/", handlerFunc)
http.ListenAndServe(":3000", nil)
}
运行: go run main.go
Go应用中 package main
的规则
每一段Go 程序都必须属于一个包。而main包在Go程序中有特殊的位置。
一个标准的可执行的Go程序必须有package main
的声明。
如果一段程序是属于main包的,那么当执行
go install
或者go run
时就会将其生成二进制文件,当执行这个文件时,就会调用main
函数。
main 包里的main
函数相当于应用程序的入口。要想生成可执行的二进制文件,必须把代码卸载main
包里,而且其中必须包含一个main
函数。
注: 存放
main
函数文件名称不一定是main.go,也可以是任何其他合规的go文件名称,例如app.go、index.go。 一般推荐使用main.go,比较直观。
标准库 fmt 包的基本使用
fmt 是使用频率非常高的一个包。 他是
format
的缩写,fmt包涵有格式化I/O函数。主要分为向外输出内容和获取输入内容两大部分。
fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")
fmt 的
Fprint
函数会将内容输出到实现了io.Writer
接口类型的变量w
中,我们通常用这个函数往文件中写入内容。注意,只要满足io.Writer
接口的类型都支持写入。在我们的代码中w
是http.ResponseWriter
的实例,已经实现了io.Writer
接口。
标准库 http 包的基本使用
标准库
net/http
提供了HTTP编程有关接口,内部封装了TCP连接和报文解析的复杂繁琐细节。http提供了HTTP客户端和服务器实现。
HTTP 客户端可用以发送请求到第三方API 或者请求网页,以获得所需数据,类似于curl 或者 wget。
HTTP 服务器用以提供HTTP 服务器来处理HTTP请求,此处我们使用了此功能;
func handlerFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")
}
func main() {
http.HandleFunc("/", handlerFunc)
http.ListenAndServe(":3000", nil)
}
http.ListenAndServe
http.ListenAndServe
用以监听本地 3000 端口以提供服务,标准的 HTTP 端口是 80 端口,如baidu.com:80
,另一个 Web 常用是 HTTPS 的 443 端口,如baidu.com:443
。当我们监听本地端口时,可使用localhost
加上端口号来访问,如以下代码:
http.ListenAndServe(":3000", nil)
我们可以通过 localhost:3000/ 进行访问。
http.HandleFunc
http.HandleFunc
用以指定处理HTTP请求的函数,此函数允许我们只写一个handler(在此例子中handlerFunc
,可任意命名),请求会通过参数传递进来,使用者只需与http.Request
和http.ResponseWriter
两个对象交互即可。
在:
fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")
中,我们利用
fmt.Fprint
将<h1>Hello,这里是goblog</h1>
字符串写入http.ResponseWriter
,即可响应用户请求。
http.Request
http.Request
使用户的请求信息,一般用r
作为简写。
一些常见操作如:
r.URL.Query()
获取用户参数- 获取客户端信息
r.Header.Get("User-Agent")
http.ResponseWriter
http.ResponseWriter
是返回用的响应,一般用w
作为简写。
常见操作如下:
- 返回500 状态码`w.WriterHeader(http.StatusInternalServerError)
- 设置返回标头
w.Header().Set("name",“my name is smallsoup”)
http 包中如何通过url 路径来处理业务逻辑
goblog 中 URL 路径解析的代码如下:
http.HandleFunc("/", handlerFunc)
我们在学习 http 包时要注意,很多时候会误以为这段代码中反斜杠
/
是站点的根目录,其实不然。
我们来做个试验:
main.go
package main
import (
"fmt"
"net/http"
)
func handlerFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")
fmt.Fprint(w, "请求路径为:"+r.URL.Path)
}
func main() {
http.HandleFunc("/", handlerFunc)
http.ListenAndServe(":3000", nil)
}
以上代码我们新增了这一行:
fmt.Fprint(w, "请求路径为:"+r.URL.Path)
用以打印当前请求的路径,保存修改后,我们重新启动程序:
go run main.go
浏览器访问以下三个链接,看看页面显示的结果:
可以看出,http.HandleFunc
里传参的 / 意味着 任意路径。
我们可以利用此机制来设置多页面访问,修改代码如下:
main.go
package main
import (
"fmt"
"net/http"
)
func handlerFunc(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
fmt.Fprint(w, "<h1>Hello, 这里测试</h1>")
} else if r.URL.Path == "/about" {
fmt.Fprint(w, "关于我们")
} else {
fmt.Fprint(w, "<h1>请求页面未找到!</h1>")
}
}
func main() {
http.HandleFunc("/", handlerFunc)
http.ListenAndServe(":3000", nil)
}
新增了 about 页面,浏览器尝试访问 localhost:3000/about :
可以看到逻辑已更新。如果我们随意访问一个不存在的页面,如 localhost:3000/no-exists 还可以看到:
现在有个问题, 是修改代码后都需要手动去 Ctrl+C 停止 go run 命令,再重新运行。效率低下
如何使用 air 来自动重载代码
安装air
GO111MODULE=on go install github.com/cosmtrek/air@latest
(windows 下 github.com/cosmtrek/air/releases 此处下载后放入 Go 安装目录下的 bin 目录,重命名为 air.exe)
最前面的 GO111MODULE=on 是只为当前命令启用 Go Module,开启以后我们才能使用 Go Proxy 进行加速。后续我们会深入讲解 Go Module ,这里你只需要记住这个用法即可。
安装成功后使用以下命令检查下:
air -v
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ , built with Go
air
在我们的 goblog 项目根目录运行以下命令:
air