-
安装GO版本。 >go1.12.17 与 <=go1.12.17 gomodule
-
GO111MODULE,GOPROXY
-
GOPATH、GOROOT
GOROOT就是go的安装路径,类似Java中的设置JAVA_ HOME.并将$GOROOT/bin加入PATH
GOPATH之下主要包含3三个目录: bin、pkg、src , bin目录主要存放可执行文件; pkg目录存放编译好的库文件,主要是* .a文件; src目录下主要存放go的源文件,不要把GOPATH设置成go的安装路径Go语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着GOPATH和工作区进行的。
-
go get, git clone, go build, go install, go mod 命令
go get : 从远程下载需要用到的包、并执行编译安装
go get https://github.com/choerodon/choerodon-cluster agent
go run : 编译并执行go文件
go install : 生成可执行文件直接放到bin目录下,如果是一个普通的包,会被编译生成到pkg目录下该文件是.a结尾;
go build : 用于编译我们指定的源码文件或代码包以及它们的依赖包
go mod : 使用gomodule进行操作
git clone : 从github上克隆依赖、项目等
-
编译后直接生成可执行文件
1.1 默认使用了静态编译,不依赖任何动态链接库,这样可以任意部署到各种运行环境,不用担
心依赖库的版本问题。易于部署到任何环境。1.2 从1.5开始直接支持跨平台交叉编译、在Mac开发的,直接可以在windows或者linux使用。
1.3 go不像Java那样编译生成字节码文件,然后再通过JVM来,编译成可执行文件;go可直接编译成其他平台的可执行文件;因此Go也具有跨平台的属性
CGO_ ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
-
没有类的概念,通过package管理
2.1 Go中没有类的概念、所有源代码管理通过package来划分,当.go输入入同一个包时,其实和所有代码写在同一个文件中是没有区别的。所以在go中我们时长可以看到一个package下面可能只有一个.go文件。2.2 用标识符(包括常量、变量、类型、函数名、结构字段等等)以-个大小来表示,对包外的可见性。包中的方法的访问权限是根据名称首字母的大小写来区分的(这点跟java很不相同) ,如果首字母是小写,则表示是包内私有的(相当于java的private ) , 如果首字母是大写,其他包就可以访问( public)。
-
结构体类型和方法对应Java中的类
3.1 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型。3.2 每个变量都叫做结构体的成员、相对于Java结构体就像是类的一种简化形式
3.3 可以通过组合替代继承
-
接口隐式实现,松耦合
4.1 类型不需要显式的声明实现某个接口,只需实现该接口的所有methods4.2 实现某个接口的类型(除了实现接口方法外)可以有其他的方法。
4.3 一个类型可以实现多个接口。通过接口的方式实现多态。
-
没有完善的错误处理机制
5.1 没有异常的概念、将错误作为返回值5.2 没有finally ,使用defer
{
//go中的error是作为返回值,返回给调用者的
//遇到错误时,只能由调用者接收,并判断错误,然后再作相应的处理
//go中的错误处理不像Java中一样能向上层层抛出
//因此Go代码中有很多的if语句用来判断错误
f, err := os. Open("filename. ext" )
err != {
log. Fatal(err)
}
defer f.Close( ) //当所有代码执行完后,执行defer的内容,像Java中的finally
}
数据类型
-
基本类型。int,float64,string,json.RawMessage,interface{}, time.Time
-
引用类型。
切片,map 类型之间的转化, 断言。
- 关于json.RawMessage类型的介绍与使用
| 关于json.RawMessage类型的介绍与使用 |
|---|
| 官方定义:RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding.(RawMessage是一个经过编码的原始JSON值。它实现了封送处理程序和反封送处理程序,可用于延迟JSON解码或预先计算JSON编码。) |
| 通俗定义:这是go标准库中encoding/json包下的一个数据类型 ,用于一些特殊的json使用需求,可以延迟json—>实例对象的转换 |
| 作用:在程序中使用Json时,有时某个字段其结构是根据其他字段(比如有个类型含义的字段)决定的,这个时候在解析时,需要先解析一部分,进行判断后,再解析出合适的Json结构。这时就需要用到Golang Json包的RawMessage这个对象。 |
| 应用场景:后端有Teacher、Student两个对象(或者更多),前端传来json数据,此时我们并不知道,他传的是Teacher还是Student,所以不能直接绑定到对应对象,因此需要对第一次传来的json作延迟转换,后端可根据前端的提示,来判断传来的body数据,是teacher还是student,再进行二次转换 |
代码如下:
//老师学生抽象成人这对象
type Person struct {
TipId int `json:"tip_id"` // 1:老师,2:学生
Body json.RawMessage `json:"body"`// 具体实例数据
}
//学生
type Student struct {
Id int `json:"id"`
StuName string `json:"stu_name"` //学生姓名
StuClass string `json:"stu_class"` //学生班级
}
//老师
type Teacher struct {
Id int
TeaName string //老师姓名
TeaDep string //老师部门
TeaCourse string //老师教的课
}
func jsonDemo01() {
//假设这是前端发来的json数据
input := `
{
"tip_id": 2,
"body": {
"id": 888,
"stu_name": "小明",
"stu_class": "高一一班"
}
} `
var person Person
json.Unmarshal([]byte(input), &person) //先将json--->person (一次转换)
fmt.Println("person type : ", person.TipId)
switch person.TipId { //判断传来的数据是老师还是学生
case 1 :
var tea Teacher
json.Unmarshal(person.Body,&tea)
fmt.Println("This is a Teacher : ",tea) //再将json中的body--->tea (二次转换)
case 2 :
var stu Student
json.Unmarshal(person.Body, &stu)
fmt.Println("This is a Student : ",stu) //再将json中的body--->stu
}
}
import "testing"
//测试代码
func TestJsonDemo01(t *testing.T) {
jsonDemo01()
}
输出如下:
| 关于time.Time 类型的介绍与使用 |
|---|
| 定义:该类型是time包下的,可精确到纳秒级 |
| 官方定义:时间以纳秒精度表示时间中的一个瞬间。使用时间的程序通常应该将它们作为值存储和传递,而不是指针。也就是说,时间变量和结构字段的类型应该是time。时间,而不是* time.Time。时间值可以被多个goroutines同时使用,除了GobDecode、UnmarshalBinary、UnmarshalJSON和UnmarshalText方法不是并发安全的…(此处省略一万字) |
| 作用:可通过Time类型的各种方法对时间进行操作,eg:返回当前时间、时间的比较、时间的格式化等 |
代码如下:
func timeDemo() {
t := time.Now() // 获取当前时间,此为time.Time类型
year, month, day := t.Date() //返回年月日
fmt.Println(year, month, day) //2020 November 20
hour, min, sec := t.Clock() //返回时分秒
fmt.Println(hour, min, sec)
day = t.Day() //返回日期
fmt.Println(day)
timeStr := t.Format(time.Kitchen) //返回指定格式时间
fmt.Println(timeStr)
//更多的操作可参考官方文档
https://golang.google.cn/pkg/time/#Time
}
- if, switch,mux化
- goto, for, select, return, break,continue
- 面向过程(函数式)
- 面向对象
- 接口化
- 组合
- 管道 channel
- 协程 go
- 广播,生产和消费,串行化
- 批量任务 waitgroup
- 循环任务 context
- &a与a的区别与约束
- for range 里的v
- 单次。testing.T
- 压测。testing.B
- 并发。testing.PB
- 无害化。可多次执行结果一致,执行后无有害数据变更
- CI。 go test ./…
- 交叉编译
- wasm
- cgo
- 基本概念
- 常用命令pull,add,commit,merge
- 经典场景
- 常见错误
- goland
- vscode
- 流程图
- UML图
- 架构图
- 思维导图
- 打栈
- 单次处理
- pprof、火焰图
- gc优化
- 对象池
- 并发模型GPM
- context与waitgroup
- 广播
- 原子操作
- 读写锁
- CAS
- 串行处理
- xml, json, protobuf, toml, yaml, 自定义协议
- http(s),ws(s), udp, kcp, tcp
- 幂等
- 分布式锁
- 缓存一致性的两种策略
- http
- websocket
- tcp
- 代码生成
- 代码检测,race、codedev、fmt
- docker
- kubernate
- Linux常见命令
- 线上监控与调优
- supervisor、ngnix
四、Web服务 服务框架(如Java中的Spring MVC) Gin
- Http Router
- Json Validation
- gorm
- 数据映射原理
- Zap
- 线程调优
- 优雅启停
- Postgres
- MySQL
- SQL语句:CRUD/Join/Group/Order …
- jsonb
- 索引规则
- WAL(xLog)
- 物理存储
- 事物隔离级别/锁 MVCC
- B树
- B+树
- 红黑树
- Explain
- 主从复制
- 水平扩展
- 垂直拆分
- 集群分布
- 分库
- 分表
- 流复制
- bottledwater-pg data change delivery to mq
- string / hash / list / map / zset
- 数据结构 / 内存模型
- 过期策略
- 持久化
- 缓存应用
- 分布式锁
- Redis Cluster
- Redis Sentinel
- protobuf
- 通信原理
- Auth
- API Manage
- Route
- Load Balancing / Rate Limiting
- keeplive
- Lease
- 缓存机制
- 通信机制
- 服务数据高可用
- Raft
七、网络安全 编码安全 行为安全
八、大数据 离线计算 数据仓库 实时计算
九、DevOPS Linux CD CI 监控
十、Cloud Native 容器化 集群管理 Service Mesh
十一、技术管理 项目管理 文档管理 技术招聘 团队管理
给自己,也给大家,路漫漫其修远兮,我将上下而求索,希望自己在Go这条路上不断前行,能点亮出一颗自己的“技能树”



