计划学习路线
书籍
《go语言核心编程》 -腾讯作者
《go语言编程之旅》 -5个项目 --对go语言能做的内容做了整体介绍吧,对细节还不够细化,对独立编写代码帮助有限
第二章 swaage 有版本冲突,等问题
《go语言底层原理刨析》 – 对基础部分的内容 做一些原理讲解,能更容易理解各种东西的边界,和一些书中一笔带过的地方
《Go并发编程实战》 --推荐读,感觉不错 内容比较硬核
《Go Web编程》
《Go语言高并发与微服务实战》
《kubernetes in action》
《系统架构 - 复杂系统的产品设计与开发》 思维导图
《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第4版)》
《基于Kubernetes的容器云平台实战/云计算与虚拟化技术丛书》
开源项目
Go42 语言42章经 – 推荐看go语言核心编程
资料网站
中文官网 | golang导航 | 菜鸟教程 | 跟着煎鱼学go | 中文api 中文api2 |
---|---|---|---|---|
思维导图 | 零碎知识 | kubernetes | gRPC | |
课程
goWeb : 腾讯
项目实战 :腾讯
不太推荐慕课网。买了某一课,观感很糟糕
课 | 钱 | 人 | 时长 | 补充 |
---|---|---|---|---|
自主开发 Paas | 348 | 252 | 24 | |
go+es8 | 599 | 166 | 30 | |
重构Redis | 499 | 319 | 20 | 作者有三星认证 |
容器微服务系统 | 368 | 755 | 20 | 看着东西挺新颖的 |
开发读书社区 | 299 | 466 | 14 | 技术倒是用了不少 |
秒杀项目 | 328 | 1373 | 15 | |
企业抽奖 | 299 | 644 | 14 |
gin 、gorm、
一般开发:grpc、gin、orm
生态:helm、operator
零碎
web框架
go 的web框架非常多。主流框架:gin、beego、kit、echo、fsthttp
- gin框架没有定义所有的middleware 而是定义了函数
HandlerFunc func(*Context)
链式加载和调用middleware,并将这个middleware具体实现开放到社区贡献社区 organizations- 官方收录中间件
- 非官方整理
beego: 开发效率,封装完整
fsthttp: 没有使用
net/http
原生库,自己解析 超文本传输协议,封装网络事件驱动。追求极高的http性能
数据库
ORM
将数据的表映射为类的一种技术(java Hibernate这种) Gorm(v1-v2版本有很大区别需要注意) 国人开发,golang中非常活跃
- 驱动支持
- MySQL 的 Gorm 驱动地址为 gorm.io/driver/mysql
- Postgres 的 Gorm 驱动地址为 gorm.io/driver/postgres
- SQLite 的 gorm 驱动地址为 gorm.io/driver/sqlite
- SQL Server 的 gorm 驱动地址为 gorm.io/driver/sqlserver
- ClickHouse 的 gorm 驱动地址为 gorm.io/driver/clickhouse
日志
log:标准包 Print、Panic、Fatal
glog: google 推出的日志包
- 日志级别:info、warning、error、fatal
- 根据文件大小切割日志
- 自定义日志级别
- 不同文件不同日志级别、vmodule
- 打印指定位置的栈信息
logrus: star最多,功能强大切灵活,docker、prometheus工具都在用
- 日志级别:debug、info、warn、error、fatal、panic
- 可扩展logrus的hook机制运行作者通过hook方式,将日志发到任意地方
- 支自定义格式日志。logrus内置了JSONFormatter和TextFormatter两周格式
- 结构化日志结论
- 预设日志字段
- 注册一个或多个handler
zap:高性能的日志
- 日志级别:debug、info、warn、error、Dpanic、Panic、Fatal
- 高性能
- 设置日志级别输出堆栈
- 结构化目录日志、预设字段、支持hool扩展
工具包
cast:常见类型之间的转换
cobra: 命令行工具 (原生 flag 基础上完善了功能 可以实现多层命令)
cron : 定时器 (原生timer 基础上实现 支持时区、秒定时)
fsnotify : 对文件监听。 例如:配置文件热更新
file-rotatelogs :用于日志文件的切割
swagger java语言 在线文档(目前推荐使用2.0版本 golang 不支持3.0目前)
- swag : 将 Golang 注释转化为 swagger.json 的开源项目
- gin + swaggo :官方示例e
- 在线编辑
- java命令工具
- ui页面
gomail : 电子邮件
Pflag: 命令行参数解析
Viper : 配置文件解析
gotests :自动测试工具
基础 命令行工具
cobra: 命令行工具 (原生 flag 基础上完善了功能)
源码说明
// Command代表执行命令的结构
type Command struct {
// 代表当前命令的,如何执行,root 最好和生成的命令工具名称一致
Use string
// 代表这个工具的别名,在 subCommand 中有用,比如 root cmd1 和 root cmd_1 想要都执行一个 subCommand 就需要这样
Aliases []string
// 由于不强制设置,用于输入错误的时候建议字段
SuggestFor []string
// 这个就是在 help 的时候一句话描述这个命令的功能
Short string
// 详细描述这个命令的功能
Long string
// 例子
Example string
// 需要验证的参数
ValidArgs []string
// 有多少个参数,这里放了一个验证函数,可以是 ExactArgs,MaximumNArgs 等,验证有多少个参数
Args PositionalArgs
// 参数别名
ArgAliases []string
// 自动生成的命令设置
BashCompletionFunction string
// 如果这个命令已经废弃了,那么就这里写上废弃信息
Deprecated string
// 如果这个命令要被隐藏,设置这个字段
Hidden bool
// Annotations are key/value pairs that can be used by applications to identify or
// group commands.
Annotations map[string]string
// 这个命令的版本
Version string
// 是否要打印错误信息
SilenceErrors bool
// 是否要打印如何使用
SilenceUsage bool
// 是否有 flag,如果这个命令没有 flag,设置为 true,那么所有的命令后面的参数都会是 arguments
DisableFlagParsing bool
// 是否打印自动生成字样: ("Auto generated by spf13/cobra...")
DisableAutoGenTag bool
// 是否显示[flags]字样
DisableFlagsInUseLine bool
// 是否打印建议
DisableSuggestions bool
// 两个字符串的差距多少会进入 suggest
SuggestionsMinimumDistance int
// 是否使用 Traverse 的方式来解析参数
TraverseChildren bool
// 解析错误白名单, 比如像未知参数
FParseErrWhitelist FParseErrWhitelist
// The *Run 函数运行顺序:
// * PersistentPreRun()
// * PreRun()
// * Run()
// * PostRun()
// * PersistentPostRun()
// 会被继承的前置 Run
PersistentPreRun func(cmd *Command, args []string)
// 会被继承的前置 Run, 带 error
PersistentPreRunE func(cmd *Command, args []string) error
// 当前这个命令的前置 Run
PreRun func(cmd *Command, args []string)
// 当前这个命令的前置 Run,带 Error
PreRunE func(cmd *Command, args []string) error
// zh: 实际跑的时候运行的函数
Run func(cmd *Command, args []string)
// zh: Run 执行错误了之后
RunE func(cmd *Command, args []string) error
// 后置运行
PostRun func(cmd *Command, args []string)
// 后置运行,带 error
PostRunE func(cmd *Command, args []string) error
// 会被继承的后置运行
PersistentPostRun func(cmd *Command, args []string)
// 会被继承的后置运行,带 error
PersistentPostRunE func(cmd *Command, args []string) error
}
代码示例
// InitFoo 初始化 Foo 命令
func InitFoo() *cobra.Command {
FooCommand.AddCommand(Foo1Command)
return FooCommand
}
// FooCommand 代表 Foo 命令
var FooCommand = &cobra.Command{
Use: "foo",
Short: "foo 的简要说明",
Long: "foo 的长说明",
Aliases: []string{"fo", "f"},
Example: "foo 命令的例子",
RunE: func(c *cobra.Command, args []string) error {
container := c.GetContainer()
log.Println(container)
return nil
},
}
// Foo1Command 代表 Foo 命令的子命令 Foo1
var Foo1Command = &cobra.Command{
Use: "foo1",
Short: "foo1 的简要说明",
Long: "foo1 的长说明",
Aliases: []string{"fo1", "f1"},
Example: "foo1 命令的例子",
RunE: func(c *cobra.Command, args []string) error {
container := c.GetContainer()
log.Println(container)
return nil
},
}
cobra.Command 当前命令;args命令参数;err 成功失败
RunE: func(c *cobra.Command, args []string) error
启动命令
看不太懂
// RunCommand 初始化根 Command 并运行
func RunCommand(container framework.Container) error {
// 根 Command
var rootCmd = &cobra.Command{
// 定义根命令的关键字
Use: "hade",
// 简短介绍
Short: "hade 命令",
// 根命令的详细介绍
Long: "hade 框架提供的命令行工具,使用这个命令行工具能很方便执行框架自带命令,也能很方便编写业务命令",
// 根命令的执行函数
RunE: func(cmd *cobra.Command, args []string) error {
cmd.InitDefaultHelpFlag()
return cmd.Help()
},
// 不需要出现 cobra 默认的 completion 子命令
CompletionOptions: cobra.CompletionOptions{DisableDefaultCmd: true},
}
// 为根 Command 设置服务容器
rootCmd.SetContainer(container)
// 绑定框架的命令
command.AddKernelCommands(rootCmd)
// 绑定业务的命令
AddAppCommand(rootCmd)
// 执行 RootCommand
return rootCmd.Execute()