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接口的类型都支持写入。在我们的代码中whttp.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.Requesthttp.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

自动重载方案,比较老牌的是 fresh ,不过此项目已经放弃维护。
我们将使用的是 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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值