原计划是去年 8 月份入 Golang 大法的,然后开一篇帖子进行写个入门指北来着。这一拖就拖到了今年。
同样是快速上手教程,这篇文章和其他的文章的不同点在于,完全假设你是 Pythonista 的入门。
Golang 安装
# 如果你是在 mac 上,建议先安装下面的 SDK 以防不测
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
# 安装 golang
brew install golang
# 配置环境变量
echo $GOPATH # /Users/twocucao/Codes/ReposGo
cd /Users/twocucao/Codes/ReposPublic/
mkcd thanos # mkdir && cd
go mod init github.com/twocucao/thanos
git remote add origin git@github.com:twocucao/thanos.git
接下来,需要解决卡 golang.org 的网络问题。
export GOPROXY=https://goproxy.io
go get -v -u github.com/hqpko/go-mod-tidy
go mod tidy
接下来就是随便找一些带有依赖库的代码。放到该文件夹下面。
你也可以直接从这里 https://github.com/twocucao/thanos.git 拉取代码
对于一些基本的数据类型,操作为 加减乘除取余数位运算等等
模块,这个概念,可大可小,大的时候,把一个程序说成是模块,小的时候,可以把一个文件,甚至你说这一个函数是一个模块,也行。
这里的模块指的是一个包下的函数。
面向对象有三大概念:
异常处理实际上可以考验一个程序员编写代码的健壮性。
事实上来说,代码写的健壮是一个程序员必备的素养。但其实在开发过程中,出于对项目进行赶工上线,需要对程序的健壮性做出一定的取舍。并且,在编写客户端,服务端,网页前端的时候基本上都会遇到这个问题。什么时候选择健壮的程序,什么时候选择是还可以的程序。需要自己的经验。
Go 多线程约等于并发。
如果有两个线程,同时进行 IO 请求,当其中一个线程连接之后,立即会主动让出 GIL, 其他线程就可以运行。
当 N 个线程在网络 I/O 堵塞,或等待重新获取 GIL,而一个线程运行 Python。
让出之后还要执行代码呀,所以要有个收回 GIL 的动作。
原子操作:sort 之类不需要
非原子操作:n=n+2 的字节码分为 加载 n , 加载 2 , 相加,存储 n, 四个步骤,由于不是原子性,很可能被由于 15 ms 而被打断。
当然,懒人一向是 : 优先级不决加括号,线程不决加 lock
对于 Java, 程序员努力在尽可能短的时间内加锁存取共享数据,减轻线程的争夺,实现最大并行。但 Python 中,线程无法并行运行,细粒度的锁就没有了优势。
go build
go install -v
go clean
go fmt
go get
go test
go tool fix . # 修复老代码到新版本
go tool vet directory|files
go tool yacc -o gopher.go -p parser gopher.y
godoc -http=:8080
go version 查看 go 当前的版本
go env 查看当前 go 的环境变量
go list 列出当前全部安装的 package
go run 编译并运行 Go 程序
# 如果你是在 mac 上,建议先安装下面的 SDK 以防不测
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
https://www.jianshu.com/p/105719434c29
https://zboya.github.io/post/go_scheduler/
https://studygolang.com/articles/16407
Go 的内存分配机制
Go 内存分配的内部结构和分配机制
https://deepu.tech/memory-management-in-golang/
https://medium.com/a-journey-with-go/go-memory-management-and-allocation-a7396d430f44
GC 三色标记算法
https://blog.golang.org/ismmkeynote
GC 介绍、三色标记的实现原理、GC 的流程以及 GC 的一些优化方案
channel 的底层实现
channel 的通讯机制、环形队列的结构、调度和唤醒的原理
https://stackoverflow.com/questions/19621149/how-are-go-channels-implemented
Go 中内存模型和同步语义
https://zhuanlan.zhihu.com/p/110032965
https://golang.org/ref/mem
https://golang.org/doc/
内存模型:Happens Before、同步语义、channel 通讯、锁
https://blog.golang.org/pipelines
Timeout、Pipeline、Cancellation、Fanout、errgroup 等模式
利用 channel 完成并行开发的设计模式,包含超时控制、管道、扇出、errgroup 并发
无法熟练使用基于 channel 通讯方式的并行编程模式
Context 传播式传递有什么意义
使用 Go 标准库 Context 的原理和最佳实践,包含超时控制、元数据传递、生命周期控制
https://blog.golang.org/context
https://levelup.gitconnected.com/context-in-golang-98908f042a57
Go 实现高性能的 TCP Server
goim 项目了解 Go 语言中 TCP Server 的基础库和性能优化方案
HTTP 框架选型
针对业务需求对 HTTP 框架做针对性的扩展
结合 gin 项目了解 Go 语言中的 HTTP Server 的基础库和框架
error 的处理复杂,不会正确使用
业务错误定义和 error 整合难度较高
Go 语言中的 error 处理实践:检查错误、定义错误、追加上下文
Go 项目中的业务错误码如何结合 error 的最佳实践
Go 项目的标准化管理
设计 API
包管理
良好的 Go 项目中的分层目录结构组织和代码规范
Go 项目中 API 的设计原则和方法:定义、状态和业务错误码处理
Go 项目中包的设计和最佳实践、go mod 的使用
go test 工具链的使用方法、单元测试的最佳实践以及 Mock 技术
在线服务的全链路视野
应用服务上层的负载均衡
DNS 的原理、防劫持的方法、HTTPDNS + IP 长连接
CDN 的系统架构、应用领域以及保证数据一致性的方法
LVS、Nginx 4/7 层负载均衡的原理和实践
Sharding 的应用场景,不会合理使用
Hash 算法的使用场景
数据分片设计,如:分库分表、多活的 Shard 设计等等
分片算法的 Hash 实现和演进:Hash 求余、一致性 Hash、有界负载一致性 Hash、节点映射
微服务的服务角色:API Gateway、BFF 还是 Service?
微服务拆分
RPC 的原理,不知道如何进行微服务 RPC 框架的选型
微服务的原理、概念,以及微服务的实现细节
API Gateway、BFF、Service 等概念精讲
微服务通讯 RPC 框架的细节和选型
如何设计高可用的分布式服务
何提升服务自愈能力
微服务的隔离实现,以及架构设计中的隔离实现
进程内超时控制和跨进程超时控制
程序自保护避免过载,抛弃一定的流量完成自适应限流
单机限流、多租户场景的分布式限流
节点故障的容错逻辑、重试容错的策略和设计
如何解决微服务的可观测性难题
怎么做微服务的可视化和标准化
出故障后,难以对微服务进行问题诊断
实现一个可以集中收集所有微服务实例的日志,并能统一查看和检索的日志采集架构
指标监控、使用 Prometheus 解决监控可视化、指标采集
微服务中的跨服务性能问题诊断,结合 Jaeger 实现分布式链路追踪
解决缓存的一致性问题
怎样合理地设计 MySQL 的表
Redis、Memcache 的应用场景、最佳实践,以及缓存的一致性设计
MySQL 的表设计、常用优化手段,以及如何解决分布式事务
消息解耦的架构设计
如何实现服务发现对平滑发布的支持
怎样利用多租户实现多测试环境
Kafka 的实现原理、异步消息系统的架构设计
RPC 服务发现、动态地址的选型和实现原理,以及基于服务发现的平滑重启和多租户架构
ChangeLog: