前言:有PHP基础,扩展第二语言,对go的高性能很感兴趣
达成目标:
- 语法糖
- go linux 安装
- go run 运行程序
- git 项目版本控制,实现服务端跑起代码
- fmt 包的基本使用
- http 包的基本使用
- air 自动重载代码
- godoc 安装使用
go 安装
官网:golang.org (需要翻墙)
谷歌:https://golang.google.cn/dl/ (需要翻墙)
国内下载:https://studygolang.com/dl
$ wget https://studygolang.com/dl/golang/go1.19.3.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
$ vim /etc/profile # 添加到环境变量
# 添加并保存
export GOROOT=/usr/local/go
export GOPATH=/www/wwwroot/gopath
export PATH=${GOROOT}/bin:$PATH
export PATH=${GOPATH}/bin:$PATH
# 使环境变量生效
# 此处报错,原因:fish命令行内source异常,退出fish运行正常
$ source /etc/profile
# 验证是否安装成功
$ go version
go version go1.19.3 linux/amd64
go环境配置
# 开启go modules
$ go env -w GO111MODULE=on
# 配置国内镜像
$ go env -w GOPROXY=https://goproxy.cn,direct
hello world
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
# 运行go
$ go run main.go
基于go mod的依赖管理
* go.mod 类似于 PHP 中的 composer.json ,而 go.sum 则是 composer.lock
* go.mod文件中的indirect 字样,标明这个依赖包还未被使用
* 默认源码包存放于 $GOPATH/pkg/mod
# 安装依赖
go get package-name
# 更新依赖版本
go get -u package-name@v1.11
# 升级最新版本
go get -u package-name
# 整理依赖,执行时会把未使用的 module 移除掉
go mod tidy
# 初始化
go mod init model-name
# 查看现有的依赖结构
go mod graph
# 下载gomod文件中指明的所有依赖
go mod download
# 编辑go.mod文件
go mod edit
# 导出项目所有的依赖到verdor
go mod verdor
# 校验一个模块是否被篡改过
go mod verify
# 查看为什么需要依赖某模块
go mod why
# 拉取所有的依赖,如果之前用gopath 或者go vendor,只需要执行初始化
go build ./...
# 清空 Go Modules 缓存
go clean -modcache
air 自动加载
- 解决每次修改都要重新编译的问题
- air 需要项目是 Go Modules 才能工作
- 将
tmp
加入.gitignore
# 安装
$ env GO111MODULE=on go install github.com/cosmtrek/air@latest // go version 1.19
$ air -v
Unknown command 'air' # gopath 没有添加入环境变量
# 使用
$ air
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ , built with Go
mkdir /www/wwwroot/gopath/src/go-blog/tmp
watching .
!exclude tmp
building...
running...
godoc 安装与使用
$ env GO111MODULE=on go install golang.org/x/tools/cmd/godoc@latest
$ ./godoc -http=:6060 # 服务器需要开放端口
在浏览器打开 http://localhost:6060
http 基本用法
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", handlerFunc)
// 用以监听本地 3000 端口以提供服务
http.ListenAndServe(":3000", nil)
}
func handlerFunc(w http.ResponseWriter, r *http.Request) {
// 设置header头
w.Header().Set("Content-Type ", "text/html;charset=utf8")
// 获取path
path := r.URL.Path
if path == "/" {
fmt.Fprint(w, "<h1>this is go blog2</h1>")
} else if path == "/about" {
fmt.Fprint(w, "<h1>this is go about</h1>")
} else {
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "<h1>404</h1>")
}
fmt.Fprint(w, "请求路径为:"+path)
}
两个http type:
ResponseWriter
http.ResponseWriter 是返回用户的响应,一般用 w 作为简写
* w.WriteHeader(http.StatusNotFound) 返回状态码
* w.Header().Set("name", "my name is smallsoup") 设置返回标头
Request
http.Request 是用户的请求信息,一般用 r 作为简写
* r.URL.Query() 获取用户参数
* r.Header.Get("User-Agent") 获取客户端信息
* r.ParseForm() 由 http 包提供,从请求中解析请求参数,必须是执行完这段代码,后面 r.PostForm 和 r.Form 才能读取到数据,否则为空数组
* r.Form:存储了 post、put 和 get 参数,在使用之前需要调用 ParseForm 方法,输出map
* r.PostForm:存储了 post、put 参数,在使用之前需要调用 ParseForm 方法,输出map,r.PostForm.Get("title")获取字段
* r.FormValue("title"), r.PostFormValue("content") 如不想获取所有的请求内容,而是逐个获取的话,这也是比较常见的操作,无需使用 r.ParseForm() 可直接使用
题外话:新手入门,多有不解,理解有偏差请不吝指教