DevOpsCamp 第 3 期(202302-b) 作业发布
本来这期想直接开始写 dnscli 命令行工具的, 但是在准备的时候发现, 还是把 interface 和 Context 说一下会比较好。
另外, 最近比较忙, 所以这期内容发布时间晚了接近一周。
作业地址还是在 Github: https://github.com/devops-camp/semi-plan-homework
如果你愿意分享自己的学习经历, 可以参考这篇文章操作 DevOpsCamp 主站改版及作业仓库变更通知(20230207)
1. Cobra08 - 使用第三方库 cobrautils 快速管理参数
提示
cobrautils
是我写的一个 cobra 扩展库, 目的是为了能在 结构体 中 方便 的管理所有 flag 和默认值。
之前我们绑定参数时, 有多少参数就要写多少个 flag, 非常的麻烦。
代码语言:javascript复制type Person struct {
Name string
Age int
}
var p=&Person{}
func init(){
root.Flags.StringVarP(&p.Name, "name","n","zhangsan","user name")
root.Flags.IntVarP(&p.Int, "age","a",20,"user age")
}
但是用了 cobrautils
后, 所有的定义都在 结构体的标签中, 就如同 YAML
和 JSON
管理参数。
作业要求
访问 https://github.com/go-jarvis/cobrautils , 阅读 README.md
实现以下效果。
代码语言:javascript复制go run .
student info
Usage:
student [flags]
Flags:
--addr.home string home address (default "Sichuan,China")
--addr.school string school address
-a, --age int student age
--contcat.email string email address
--contcat.phone string phone number (default "138-8888-8888")
--gender
-h, --help help for student
--name string student name (default "zhangsan")
2. Golang 接口(interface) 简介和入门使用
提示
上下文 Context
应该是 Go语言 中一个极其重要的 基石 概念了。
这里有一篇 Go 语言设计与实现 - 接口 interface , 是目前我学习的资料中 完成度 和 友善度 都很高的一篇文章。
在 go v1.18
中, interface
有了一个别名 any
。所以在说 interface 和 any 的时候, 其实说的是相同的东西。
interface
的使用场景到处都是。还记得我们之前说的 JSON
和 YAML
的配置文件处理吗?
// json.Marshal
func Marshal(v any) ([]byte, error) {
// ....
}
看完文章, 你至少应该知道
- 什么是 鸭式对象 ?
- 怎么使用 接口断言 ?
作业
人和大熊猫都是哺乳动物
- 他们都会 吃 (Eat) 吃东西, 区别是 人吃饭, 熊猫吃竹子
- 更大的不同是, 人会 **读书 (Read)**, 熊猫不会。
func Eating(v any){
v.Eat() // output: ???
}
func WhoAreYou(v any){
// ????
}
3. Golang Context 简介和入门使用
提示
上下文 Context
应该是 Go语言 中一个极其重要的 基石 概念了。
这里有一篇 Go 语言设计与实现 - 上下文 Context , 是目前我学习的资料中 完成度 和 友善度 都很高的一篇文章。
不管你愿不愿意, 用 Go 都绕不过 Context。不管用不用, 在所有 公共方法或函数 中强迫自己自己使用 context 作为入参。虽然有点武断,但是...(我也没有想到好的理由)
作业
就用 context 实现一个 曹操打新野 的传递游戏吧。
代码语言:javascript复制main -> Lubei(ctx context.Context, n int)
-> Guanyu(ctx context.Context)
-> Zhangfei(ctx context.Context)
- 给刘备传递 任意数字
- 刘备拿到数字, 并输出 “曹操来了 n 万人”
- 刘备把数字传递给关羽。
- a. 如果数字为偶数, 直接传递给张飞
- b. 如果数字为奇数, 数字扩大10倍后传递给张飞。
- c. 输出 “曹操来了 n 万人”。(注意 n 的直)
- 张飞拿到数字, 直接输入 “曹操来了 n 万人”。