Go 入门
语言特点
- Go语言引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在
- 天然支持并发(所以非常支持云计算)
- 语言层面支持并发,实现简单
- gorotine,轻量级线程,可实现大并发处理,高效利用多核
- 基于CPS并发模型(Communicating Sequential Processes)实现
- 管道通信机制,形成Go语言特有的管道channel,通过管道实现Goroutine之间的通信
- 支持多值返回
- 切片slice,延时执行defer
环境配置
- 在windows上下载好的go文件,
go doc/go fmt/go
go.exe
用来编译go代码 - apt-get卸载
- 对于linux,需要在
~/.bashrc
下设置路径,source ~/.bashrc
命令更新配置,其中GOROOT
就是go的源码包的位置,GOPATH
是工作目录,是开发者Go的项目默认路径
Go语言分析
- 天生支持并发,
- 可以编译,可以解释
- runtime系统调度,高效的GC
- Go语言可以通过调Cgo包写C代码
Golang执行流程
- 如果是对源码先编译,再执行,Go的执行流程
- 如果是用
go run
直接执行Go源代码,解释执行 - 编译执行与解释执行的区别:
- 对于编译执行,生成的二进制文件,可以放到没有go开发环境,仍然可以执行
go run
就是直接执行,没有生成二进制文件- 编译后的二进制文件,引入了很多run time,所以比源文件大很多
VScode go插件安装
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
之后重启VScode,看报错安装即可
go module
go env -w GO111MODULE=on
开启Go Modules
随便创建一个目录,之后初始化Go Modules
go mod init github.com/yitong/35_goModule
切片
- 切片就像数组的引用,切片并不存储任何数据,它只是描述了底层数组中的一段。更改切片的元素会修改其底层数组中对应的元素。与它共享底层数组的切片都会观测到这些修改。
[3]bool{true, true, false}
会创建一个真实的数组[]bool{true, true, false}
会创建一个真实的数组,并且创建一个引用了它的切片
函数闭包
- Go的函数可以是一个闭包,闭包是一个函数,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,也就是说该函数被这些变量绑定在一起
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
// 每个adder()返回的函数都和sum绑定了
// 0 0
// 1 -2
// 3 -6
// 6 -12
// 10 -20
// 15 -30
// 21 -42
// 28 -56
// 36 -72
// 45 -90
方法
- 可以为非结构体类型声明方法,但是不能是basic type,必须在一个包内为其取别名