《后端极速转职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经典的案 即时通信系统