Go从入门到放弃
2023-02-17

教程来自:https://www.liwenzhou.com/posts/Go/go_menu/

基本命令

go mod init ****    // 项目初始化
go build    // 编译,可选参数-o指定编译后名称
go run **** // 直接执行程序,该命令本质上也是先编译再执行。
go install  // 安装:编译后移动至GO目录中的Bin下,系统配置环境变量后,可任意位置执行

跨平台编译

Windows

SET CGO_ENABLED=0  // 禁用CGO
SET GOOS=linux  // 目标平台是linux
SET GOARCH=amd64  // 目标处理器架构是amd64

Mac 下编译 Linux 和 Windows平台 64位 可执行程序:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux 下编译 Mac 和 Windows 平台64位可执行程序:

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Windows下编译Mac平台64位可执行程序:

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build

依赖管理 - go module

go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用

go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等

使用go module之后我们可不用将代码放置在src下了

开启 go module

1.13+版本判断开不开启MODULE的依据是根目录下有没有go.mod文件

手动开启
windows:
set GO111MODULE=on
mac:
export GO111MODULE=on
然后输入
go env
查看 GO111MODULE 选项
为 on 代表修改成功

GOPROXY设置

https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md

go mod命令

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

go.mod文件说明

go.mod文件记录了项目所有的依赖信息

module用来定义包名
require用来定义依赖包及版本
indirect表示间接引用

go get

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  1. 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)

  2. 运行go get -u=patch将会升级到最新的修订版本

  3. 运行go get package@version将会升级到指定的版本号version

如果下载所有依赖可以使用go mod download命令。

项目中使用go module

go mod init
go get

变量

声明

var 变量名 变量类型
​
var name string
var age int
var isOk bool
​
OR
​
var (
    a string
    b int
    c bool
    d float32
)

初始化

var 变量名 类型 = 表达式
​
var name string = "Q1mi"
var age int = 18
​
OR
​
var name, age = "Q1mi", 20
​
OR
// 类型推导
var name = "Q1mi"
var age = 18
短变量声明
n := 10
匿名变量
func foo() (int, string) {
    return 10, "Q1mi"
}
func main() {
    // 忽略第二个值
    x, _ := foo()
    // 忽略第一个值
    _, y := foo()
    fmt.Println("x=", x)
    fmt.Println("y=", y)
}

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明 注意:

  1. 函数外的每个语句都必须以关键字开始(var、const、func等)

  2. :=不能使用在函数外。

  3. _多用于占位,表示忽略值。

常量