学习资料
安装
环境变量配置
- 在/etc/profile文件中添加
export PATH=$PATH:/usr/local/go/bin
- 执行命令立即生效
source /etc/profile
- 输入命令查看配置是否成功
go
安装DELVE
1. 安装Homebrew,执行命令
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 安装成功后,执行
brew install go-delve/delve/delve
Visual Studio Code插件安装
设置代理
首选项-设置
http.proxy
需要安装的插件,会自动在右下角弹出提示,具体插件如下
Installing 9 tools at /Users/mac/go/bin
gocode
gopkgs
go-outline
go-symbols
guru
gorename
godef
goreturns
golint
开发工具
- 推荐使用Visual Studio Code
- 各类工具点评:Go开发工具、Go语言有什么好用的IDE吗?
终端设置代理
$ export http_proxy=http://proxyAddress:port
$ export ALL_PROXY=socks5://127.0.0.1:1080
原文:让终端走代理的几种方法
Go语言简介
第3章打包和工具链
3.1包
- 同一个目录下的所有.go文件必须声明同一个包名
3.1.2 main包
- 在Go语言里,命名为main的包具有特殊的含义。Go语言的编译程序会试图把这种名字的包编译为二进制可执行文件。main()函数是程序的入口,程序编译时,会使用声明main包的代码所在的目录的目录名作为二进制可执行文件的文件名。
- 使用“远程导入”时,请确保您的网络畅通无阻。
import (
// 远程导入
"github.com/goinaction/code/chapter2/sample/search"
)
3.2.2 命名导入
- 导入的多个包具有相同的名字,可以使用命名导入:在import语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。
package main
import (
"fmt"
myfmt "mylib/fmt"
)
- 当你导入了一个不在代码里使用的包时,Go编译器会编译失败,并输出一个错误。目的是避免代码变的臃肿。
- 有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。在这种情况,可以使用空白标识符_来重命名这个导入。
空标识符
下划线字符(_)在Go语言有很多用法。用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不兴趣的值。
3.3 函数init
- 每个包可以包含任意多个init函数,会在main函数之前执行。
func init() {
// 执行操作
}
3.4 使用Go的工具
- 使用命令执行编译和清理工作
go build
go clean
3.5.1 go vet
- 检测代码的常见错误
3.7.2 对gb的介绍
- 依赖管理
- gb工程会区分开发人员写的代码和开发人员需要依赖的代码。
- gb工程与Go官方工具链(包括go get)并不兼容。因为gb不需要设置GOPATH,而Go工具链无法理解gb工程的目录结构。
第4章 数组、切片和映射
数组
- 由于数组占用的内存是连续分配的,CPU能把正在使用的数据缓存更久的时间。
声明和初始化
- 在Go语言中声明变量时,总和使用对应类型的零值来对变量进行初始化。
// 声明一个包含5个元素的整型数组
var array [5]int
// 声明一个包含5个元素的整型数组
// 用具体值初始化每个元素
array := [5]int{10, 20, 30, 40, 50}
- 如果使用…代替数组的长度,Go语言会根据初始化时数组元素的数量来确定该数组的长度。
// 声明一个整型数组
// 用具体值初始化每个元素
// 容量由初始化值的数量决定
array := [...] int{10, 20, 30, 40, 50}
// 声明一个有5个元素的数组
// 用具体值初始化索引为1和2的元素
// 其余元素保持零值
array := [5]int{1: 10, 2: 20}
切片
- 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。
创建和初始化
1. 使用make函数创建切片,需要传入一个参数,指定切片的长度。
- 如果只指定长度,那么切片的容量和长度相等。也可以分别指定长度和容量。
// 创建一个字符串切片
// 其长度和容量都是5个元素
slice := make([] string, 5)
- 分别指定长度和容量时,创建的切片,底层数组的长度是指定的容量,但是初始化后并不能访问所有的数组元素。
// 创建一个整型切片
// 期长度为3个元素,容量为5个元素
slice := make([] int, 3, 5)
2. 使用切片字面量创建切片,这种方法和创建数组类似,只是不需要指定[]运算符里的值。初始的长度和容量会基于初始化时提供的元素的个数确定。
// 创建字符串切片
// 期长度和容量都是5个元素
slice := [] string {"Red", "Blue", "Green", "Yellow", "Pink"}
- 可以设置初始长度和容量:在初始化时给出所需的长度和容量作为索引。
// 创建字符串切片
// 使用空字符串初始化第100个元素
slice := [] string{99: ""}
- 如果在[]运算符里指定了一个值,那么创建的就是数组而不是切片。
映射
- Map数据结构
第5章 Go语言的类型系统
定义类型的方法
使用struct关键字
// user在程序里定义一个用户类型
type user struct{
name string
email string
ext int
privileged bool
}
// 声明user类型的变量,并初始化所有字段
lisa := admin{
name: "Lisa",
email: "lisa@email.com",
ext: 123,
privileged: true,
}
// 也可以这样
// 声明user类型的变量
lisa := user{"Lisa", "lisa@email.com", 123, true}
零值
- 数值型:0
- 字符串:空字符串
- 布尔类型:false
第6章 并发
并发与并行的概念
- 并发(concurrency)不是并行(parallelism)。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。
goroutine
- 一个线程可以创建多个goroutine
锁住共享资源
- 原子函数
- 互斥锁
- 通道
第7章 并发模式
- runner
- pool
- work