《后端极速转职Golang程师》
golang环境安装
源码包下载
https://golang.org/dl/ 国外官
https://golang.google.cn/dl/ 中国镜像
https://studygolang.com/dl 中󰕲站
linux为
源码包 go1.14.4.linux-amd64.tar.gz
解压源码包到/usr/local sudo tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local/
配置环境变󰮢
打开~/.bashrc 添加如下配置变󰮢
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
GOROOT 表示源码包所在󰩁径
GOPATH 开发者Go的项󰋴默认󰩁径
同的操作系统具体配置同
检测开发环境
动加载~/.bashrc source ~/.bashrc
go version
go --help
没有任何错误提示表示环境搭建成功
IDE的推荐
收费 Goland
免费 VsCode
Vim + go插件
golang语󰤛特性
优势
简单的部署
可直接编译成机码可执󰢩
依赖其他库
直接运󰢩即可部署
静态类型语󰤛
编译的时候即可检查出来隐藏的
多数问题
语󰤛层󰴯的并发
天󰈿基因持
充分的󰉁多核
强的标准库
runtime系统调度机制
󰷼效的GC垃圾回收
丰富的标准库
简单学
25个关键字
C语󰤛简洁基因,内嵌C语法持
󰴯向对象特征
跨平台
领军
适合做么
云计算基础设施领域
docker
kubernetes
etcd
consul
cloudflare CDN
七󰅮云存储
基础后端软件
tidb
influxdb
cockroachdb
微服务
go-kit
micro
互联󰕲基础设施
以太坊
hyperledger
明星作品
󰨤
包管󰇹,部分包都在github上
泛化类型
所有Excepiton都󰉁Error来处󰇹(较有争议)。
对C的降级处󰇹,并󰴬缝,没有C降级到asm那么完美(序化问题)
golang语法新奇
从个main函数初󰤁golang语法
package main
import "fmt"
func main() {
/* 简单的程序 万能的hello world */
fmt.Println("Hello Go")
}
golang中的表达式,加";", 和
加 都可以,建议是加
函数的{ 定是 和函数名在同󰢩的,否则编译错
package main //程序的包名
/*
import "fmt"
import "time"
*/
import (
"fmt"
"time"
)
变󰮢 变󰮢的声明
局部变󰮢的声明
法
//法:声明个变󰮢 默认的值是0
var a int
法
//法:声明个变󰮢,初始化个值
var b int = 100
法三
//法三:在初始化的时候,可以省去数据类型,通过值󰙵动匹配当前的变󰮢的数据类型
var c = 100
法四(常󰉁)
//法四:(常󰉁的法) 省去var关键字,直接󰙵动匹配
e := 100
全局变󰮢的声明 法四持全局
多变󰮢的声明
单󰢩写法
var xx, yy int = 100, 200
var kk, ll = 100, "Aceld"
多󰢩写法
var (
vv int = 100
jj bool = true
)
常󰮢与iota
常󰮢
const a int = 10
const (
a = 10
b = 20
)
iota
与const来表示枚举类型
函数
多返回值
init函数与import导包
init函数
制作包的时候,项󰋴󰩁径如下
$GOPATH/GolangStudy/5-init/
├── lib1/
│ └── lib1.go
├── lib2/
│ └── lib2.go
└── main.go
main.go
lib1.go
lib2.go
import导包
import _ “fmt”
给fmt包起个别名,名, 法使󰉁当前包的法,但是
会执󰢩当前的包内部的init()法
import aa “fmt” 给fmt包起个别名,aa, aa.Println()来直接调󰉁。
import . “fmt”
将当前fmt包中的全部法,导到当前本包的作󰉁中,fmt包中
的全部的法可以直接使󰉁API来调󰉁,需要fmt.API来调󰉁
指针
defer
知识点1 defer的执󰢩顺序
执󰢩顺序是 fun3() -> func2()-> func1()
知识点2 defer和return谁先谁后
执󰢩结果:
结论: return之后的语先执󰢩,defer后的语后执󰢩
切󰅧slice
数组 声明数组的式
数组的󰲊度是固定的
固定󰲊度的数组在传参的时候,
是严格匹配数组类型的
slice(动态数组)
动态数组在传参上是引󰉁传递,󰖳且同元素󰲊度的动态数组他们的形参是致。
slice
声明式
使󰉁式
切󰅧容󰮢的追加
len 和 cap
切󰅧的󰲊度和容󰮢同,󰲊度表示左指针󰙸右指针之间的距离,容󰮢表示左指针󰙸底层数组末尾的距离。
切󰅧的扩容机制,append的时候,如果󰲊度增加后超过容󰮢,则将容󰮢增加2倍
切󰅧的截取
map
声明式
使󰉁式
󰴯向对象特征
封装
类名、属性名、法名 󰶳字写表示对外(其他包)
可以访问,否则只能够在本包内访问
继承
󰅠类
类
定义类
多态
基本的要素
有个󰅠类(有接)
有类(实现󰅠类的全部接法)
󰅠类类型的变󰮢(指针) 指向(引󰉁) 类的具体数据变󰮢
interface 通󰉁万能类型
interface{}
空接
int 、string、float32、
float64、struct ....
都实现interface{}
就可以󰉁interface{}类型 引󰉁 任
意的数据类型
类型断󰤛
反射
变󰮢的结构
reflect包
结构体标签
结构体标签的定义
结构体标签应󰉁
json编解码
orm映射关系
golang󰷼阶
goroutine
runtime.Goexit() 退出当前的goroutine
channel
channel的定义
channel的使󰉁
缓冲的channel
在第 1 步,两个 goroutine 都到达通道,但哪个都没有开始执󰢩发送或者接收。
在第 2 步,左侧的 goroutine 将它的伸进通道,这模拟向通道发送数据的󰢩
为。这时,这个 goroutine 会在通道中被锁住,直到交换完成。
在第 3 步,右侧的 goroutine 将它的放通道,这模拟从通道󰮟接收数据。这
个 goroutine 样也会在通道中被锁住,直到交换完成。
在第 4 步和第 5 步,进󰢩交换,并最终,在第 6 步,两个 goroutine 都将它们的
从通道󰮟拿出来,这模拟被锁住的 goroutine 得到释放。两个 goroutine 现在
都可以去做其他事情。
有缓冲的channel
在第 1 步,右侧的 goroutine 正在从通道接收个值。
在第 2 步,右侧的这个 goroutine独󰐩完成接收值的动作,󰖳左侧的
goroutine 正在发送个新值到通道󰮟。
在第 3 步,左侧的goroutine 还在向通道发送新值,󰖳右侧的 goroutine 正在
从通道接收另外个值。这个步骤󰮟的两个操作既是同步的,也会互相阻
塞。
最后,在第 4 步,所有的发送和接收都完成,󰖳通道󰮟还有个值,也有些空
间可以存多的值。
特点
当channel已经满,再向󰮟󰴯写数据,就会阻塞
当channel为空,从󰮟󰴯取数据也会阻塞
关闭channel
channel像件样需要经常去关闭,只有当你确实没有任何发送数据,或者你想显式的结
束range循环之类的,才去关闭channel;
关闭channel后,法向channel 再发送数据(引发 panic 错误后导致接收󰐩即返回零值);
关闭channel后,可以继续从channel接收数据;
对于nil channel,论收发都会被阻塞。
channel与range
channel与select
单流程下个go只能监控个channel的状态,select可以完成
监控多个channel的状态
select具备多󰩁channel的监控状态功能
go modules模块管󰇹
课程󰋴标 掌握go mod 和 go modules 进󰢩项󰋴依赖管󰇹
么是Go Modules
Go modules 是 Go 语󰤛的依赖解决案,发布于 Go1.11,成󰲊于
Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在󰈿产上使󰉁。
解决么问题
Go 语󰤛󰲊久以来的依赖管󰇹问题。
“淘汰”现有的 GOPATH 的使󰉁模式。
统社区中的其它的依赖管󰇹具(提供迁移功能)。
GOPATH的作模式 GOPATH的弊端
版本控制概念
法同步致第三版本号
法指定当前项󰋴引󰉁的第三版本号
Go Modules模式
go mod命令
go mod init 󰈿成 go.mod 件
go mod download 下载 go.mod 件中指明的所有依赖
go mod tidy 整󰇹现有的依赖
go mod graph 查看现有的依赖结构
go mod edit 编辑 go.mod 件
go mod vendor 导出项󰋴所有的依赖到vendor󰋴录
go mod verify 校验个模块是否被篡改过
go mod why 查看为么需要依赖某模块
go mod 环境变󰮢
GO111MODULE
是否开启go modules模式
建议go V1.11之后,都设置为on
GOPROXY
项󰋴的第三依赖库的下载源地址
建议设置国内的地址
阿󰮟云 https://mirrors.aliyun.com/goproxy/
七󰅮云 https://goproxy.cn,direct
direct 󰉁于指示 Go 回源到模块版本的源地址去抓取(如 GitHub 等)
GOSUMDB
󰉁来校验拉取的第三库是否是完整的
默认也是国外的󰕲站,如果设置GOPROXY,这个就󰉁设置
GONOPROXY 通过设置GOPRIVATE即可
GONOSUMDB 通过设置GOPRIVATE即可
GOPRIVATE 通过设置GOPRIVATE即可
go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx
表示git.example.com 和 github.com/aceld/zinx
是私有仓库,会进󰢩GOPROXY下载和校验
go evn -w GOPRIVATE="*.example.com"
表示所有模块󰩁径为example.com的域名,如
git.example.com 或者 hello.example.com 都进󰢩
GOPROXY下载和校验
通过 go env来查看环境变󰮢
go env -w GO111MODULE=on
或者通过 Linux export 环境式也可以
使󰉁Go Modules初始化项󰋴
1 开启Go Modules模块 保证GO111MODULE=on
go env -w GO111MODULE=on
export GO111MODULE=on
设置在󰉁户启动脚本中
需要重新打开终端或者执󰢩source ~/.bashrc
2 初始化项󰋴
任意件夹创建个项󰋴(要求在$GOPATH/src) mkdir -p $HOME/aceld/modules_test
创建go.mod件,同时起当前项󰋴的模块名称 go mod init github.com/aceld/module_test
就会󰈿成个go mod件
module github.com/aceld/moudles_test
go 1.14
在该项󰋴编写源代码
如果源代码中依赖某个库(如: github.com/aceld/zinx/znet)
动down go get github.com/aceld/zinx/znet
󰙵动down
go mod 件会添加󰢩新代码
module github.com/aceld/moudles_test
go 1.14
require github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 // indirect
含义当前模块依赖github.com/aceld/zinx
依赖的版本是 v0.0.0-20200315073925-f09df55dc746
//indirect 表示间接依赖
因为项󰋴直接依赖的是znet包
所以所间接依赖zinx包
会󰈿成个go.sum件
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 h1:TturbcEfboY81jsKVSQtGkqk8FN8ag0TmKYzaFHflmQ=
github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746/go.mod h1:bMiERrPdR8FzpBOo86nhWWmeHJ1cCaqVvWKCGcDVJ5M=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
go.sum件的作󰉁 罗当前项󰋴直接或间接的依赖所有模块版本,保证今后项󰋴依赖的版本会被篡改
h1:hash
表示整体项󰋴的zip件打开之后的全部件的校验和来󰈿成的hash
如果存在,可能表示依赖的库可能󰉁上
xxx/go.mod h1:hash go.mod件做的hash
修改项󰋴模块的版本依赖关系
go mod edit -replace=zinx@v0.0.0-20200306023939bc416543ae24=zinx@v0.0.0-20200221135252-8a8954e75100
go mod件就会被修改
module github.com/aceld/modules_test
go 1.14
require github.com/aceld/zinx v0.0.0-20200306023939-bc416543ae24 // indirect
replace zinx v0.0.0-20200306023939-bc416543ae24 => zinx v0.0.0-20200221135252-8a8954e75100
试󰅮 golang经典的案 即时通信系统