Golang学习笔记,从入门到精通,持续记录

2023-02-17 15:20:25 浏览数 (1)

Golang官网:https://go.dev/、Golang下载:https://go.dev/、Golang学习文档:https://go.dev/doc/

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

安装Golang

相关文档:https://go.dev/doc/install,下载对应操作系统的安装包后,按说明安装即可;

环境变量

环境变量主要是能操作系统能在任意目录访问go的可执行文件,Window下将go的安装目录添加到PATH环境变量即可(C:Program FilesGobin);

代码语言:javascript复制
GOOS            #编译系统
GOARCH          #编译arch
GO111MODULE     #gomod开关
GOPROXY         #go代理 https://goproxy.io  https://goproxy.cn
GOSSAFUNC       #生成SSA.html文件,展示代码优化的每一步 GOSSAFUNC=func_name go build
GOPATH          #用来指定项目开发目录,所有项目文件都在这个路径下面
GOROOT          #GO的安装路径

依赖管理

1.软件包

软件包仓库:https://pkg.go.dev/,Go1.13之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的;修改镜像地址:

代码语言:javascript复制
go env -w GOPROXY=https://goproxy.cn,direct

Go语言从v1.5开始开始引入vendor模式,查找项目的某个依赖包,首先会在项目根目录下的vender文件夹中查找,如果没有找到就会去$GOAPTH/src目录下查找。

从 Go1.11 开始, Go 官方加入 Go Module 支持, Go1.12 成为默认支持; 从此告别源码必须放在 Gopath 中 以及 Gopath 对初学者造成的困扰.

要启用go module支持首先要设置环境变量GO111MODULE(如其名字所暗示,GO111MODULE 是 Go 1.11 引入的新版模块管理方式。),通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。

  • GO111MODULE=off禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
  • GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
  • GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。

简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。

相关

使用 go module 管理依赖后会在项目根目录下生成两个文件go.mod和go.sum。 

2.初始化

代码语言:javascript复制
go mod init [module 名称]  #初始化
go mod tidy               #检测和清理依赖

3.安装依赖

代码语言:javascript复制
go get -v path #安装指定包
go get -u  #更新依赖
go get -u github.com/go-ego/gse  #更新指定包依赖
go get -u github/com/go-ego/gse@v0.60.0-rc4.2  #指定版本

4.替换安装源

在国内访问http://golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。

代码语言:javascript复制
# 使用命令行:
go mod edit -replace github.com/go-ego/gse=/path/to/local/gse
go mod edit -replace github.com/go-ego/gse=github.com/vcaesar/gse

#直接修改模块文件:
replace github.com/go-ego/gse => github.com/vcaesar/gse

5.常用命令

代码语言:javascript复制
go mod init  # 初始化 go.mod
go mod tidy  # 更新依赖文件
go mod download  # 下载依赖文件

go mod vendor  # 将依赖转移至本地的 vendor 文件
go mod edit  # 手动修改依赖文件
go mod graph  # 打印依赖图
go mod verify  # 校验依赖

6.GOPATH

go 命令依赖一个重要的环境变量:$GOPATH,Go 从1.1版本到1.7必须设置这个变量,而且不能和Go的安装目录一样,这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件。所以这个目录下面有三个子目录:src、bin、pkg

从go 1.8开始,GOPATH 环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go,在Windows上默认为%USERPROFILE%/go。

  • src 存放源代码(比如:.go .c .h .s等)
  • pkg 编译后生成的文件(比如:.a)
  • bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 PATH 变量中,如果有多个gopath,那么使用{GOPATH//://bin:}/bin添加所有的bin目录)

7. go.mod

go.mod文件记录了项目所有的依赖信息,其结构大致如下:

代码语言:javascript复制
module github.com/Q1mi/studygo/blogger

go 1.12

require (
	github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
	github.com/gin-gonic/gin v1.4.0
	github.com/go-sql-driver/mysql v1.4.1
	github.com/jmoiron/sqlx v1.2.0
	github.com/satori/go.uuid v1.2.0
	google.golang.org/appengine v1.6.1 // indirect
)
  • module用来定义包名
  • require用来定义依赖包及版本
  • indirect表示间接引用

相关文档:https://zhuanlan.zhihu.com/p/359843333

IDE工具

Jetbrains全家桶:https://www.jetbrains.com/zh-cn/go/

代码目录结构 

GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。

所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb",包名称是最后一个目录beedb

注意

一般建议package的名称和目录名保持一致

1.编译应用包

代码语言:javascript复制
# 编译后生成编译的应用包文件到pkg
cd 应用包源代码目录
go install 
# 或者
go install  应用包源代码目录

命令行

1. 命令大全

代码语言:javascript复制
go build      // 编译包和依赖包
go clean      // 移除对象和缓存文件
go doc        // 显示包的文档
go env        // 打印go的环境变量信息
go bug        // 报告bug
go fix        // 更新包使用新的api
go fmt        // 格式规范化代码
go generate   // 通过处理资源生成go文件
go get        // 下载并安装包及其依赖
go install    // 编译和安装包及其依赖
go list       // 列出所有包
go run        // 编译和运行go程序
go test       // 测试
go tool       // 运行给定的go工具
go version    // 显示go当前版本
go vet        // 发现代码中可能的错误

2. go get

get 命令用来解决go模块及其依赖项目的下载、创建和安装问题。实际该命令线执行从在线仓库(BitBucket、GitHub、Google Code、国内的gitee等)下载模块(包),再执行Go Install命令。get 命令是依赖git。

get 会先下载相关依赖项目模块,下载时每个包或包的部分模块,下载的版本默认遵从以下顺序:最新release版 > 最新pre-release版 > 其他可用的较高版本

  • -d 只下载,而不执行创建、安装
  • -t 同时下载命令行指定包的测试代码(测试包)
  • -u 在线下载更新指定的模块(包)及依赖包(默认不更新已安装模块),并创建、安装
  • -v 打印出所下载的包名
  • -insecure 允许命令在非安全的scheme(如HTTP)下执行get命令
  • -fix 在下载代码包后先执行修正动作,而后再进行编译和安装,根据当前GO版本对所下载的模块(包)代码做语法修正
  • -f 忽略掉对已下载代码包的导入路径的检查
  • -x 打印输出,get 执行过程中的具体命令

学习文档

  • https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md 
  • https://github.com/Unknwon/go-study-index

0 人点赞