Go语言特点
- 没有头文件概念,
.go
后缀 - 强类型语言,编译型语言
- 一个go语言的应用程序,在运行的时候是不需要依赖外部库的
- 把执行时需要的库都打包到程序中
- go程序比较大
- 如果import的包没有使用,那么程序不允许编译
- go语法不区分平台的,在windos下面编译的一个程序,可以在Linux上运行,需要配置环境变量来控制
- GOOS:设定运行平台
- mac:darwin
- linux:linux
- windos:windos
- GOARCH:目标平台的体系架构
- 386
- amd64
- arm
- GOOS:设定运行平台
Go命令
go build -o 生成文件名.exe 编译文件名.go
go run *.go
- 直接运行程序不会编译成exe文件
安装程序
- ./configure
- make
- make install —>将编译好的程序安装到指定目录
go install
- 将编译后的可执行文件安装到 GOBIN 目录下
go mod
- go mod 资料连接
依赖包存储位置
- 使用go get获取的包放在
$GOPATH/src/
目录下 - 使用go mod下载的依赖包放在
$GOPATH/pkg/mod/
目录下,所有项目共享
Go目录结构
一般的,一个Go项目在GOPATH下,会有如下三个目录:
一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。
|
|
bin
存放编译后的可执行文件1
pkg
存放编译后的包文件
pkg
中的文件是Go编译生成的,而不是手动放进去的
src
存放项目源文件
Go数据类型
- go语言不支持隐式类型转换
- 比如从int 转为 int 64就会发生编译错误
显示类型转换和隐式类型转换
- 当两种或多种数据类型进行某种操作时,不需要干预,系统会自动进行隐式转换。
- 但你需要把一个 long 类型的数据转成 int 时,又或者让 string 与 int 互转,当数据小数点太多时,这时候就必须使用 显式转型
Golang的零值
- Go语言中的零值是变量没有做初始化时系统默认设置的值。 所有其他数值型的类型(包括complex64/128)零值都是0,可以用常量表达式代表数值0的任何形式表示出来。 但是类型不能混用,变量类型和零值类型必须匹配。
- 布尔类型的零值(初始值)为 false,数值类型的零值为 0,字符串类型的零值为空字符串"",而指针、切片、映射、通道、函数和接口的零值则是 nil。
Go基础语法
变量
|
|
自增/自减 语法
|
|
指针
|
|
string
|
|
定长数组
在不考虑逃逸分析的情况下,如果数组中元素的个数小于或者等于 4 个,那么所有的变量会直接在栈上初始化,如果数组元素大于 4 个,变量就会在静态存储区初始化然后拷贝到栈上,这些转换后的代码才会继续进入中间代码生成和机器码生成两个阶段,最后生成可以执行的二进制文件
|
|
切片
扩容是为切片分配新的内存空间并拷贝原切片中元素的过程
|
|
切片2
在分配内存空间之前需要先确定新的切片容量,运行时根据切片的当前容量选择不同的策略进行扩容:
- 如果期望容量大于当前容量的两倍就会使用期望容量;
- 如果当前切片的长度小于 1024 就会将容量翻倍;
- 如果当前切片的长度大于 1024 就会每次增加 25% 的容量,直到新容量大于期望容量;
|
|
切片的很多功能都是由运行时实现的,无论是初始化切片,还是对切片进行追加或扩容都需要运行时的支持,需要注意的是在遇到大切片扩容或者复制时可能会发生大规模的内存拷贝,一定要减少类似操作避免影响程序的性能。
map 字典
$$当桶的数量小于2^4时,由于数据较少、使用溢出桶的可能性较低,会省略创建的过程以减少额外开销;$$
$$当桶的数量多于 2^4 时,会额外创建 2^(B−4)个溢出桶;$$
|
|
func 函数
|
|
内存逃逸
|
|
Switch选择分支
|
|
标签LABEL
|
|
枚举iota
|
|
结构体
|
|
defer函数 & 匿名函数
|
|
init函数
|
|