DevOpsCamp 第 3 期(202302-b) 作业发布

2023-02-25 20:05:05 浏览数 (1)

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 后, 所有的定义都在 结构体的标签中, 就如同 YAMLJSON 管理参数。

作业要求

访问 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 的使用场景到处都是。还记得我们之前说的 JSONYAML 的配置文件处理吗?

代码语言:javascript复制
// json.Marshal
func Marshal(v any) ([]byte, error) {
// ....
}

看完文章, 你至少应该知道

  1. 什么是 鸭式对象
  2. 怎么使用 接口断言

作业

人和大熊猫都是哺乳动物

  1. 他们都会 吃 (Eat) 吃东西, 区别是 人吃饭, 熊猫吃竹子
  2. 更大的不同是, 人会 **读书 (Read)**, 熊猫不会。
代码语言:javascript复制
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)
  1. 给刘备传递 任意数字
  2. 刘备拿到数字, 并输出 “曹操来了 n 万人”
  3. 刘备把数字传递给关羽。
  • a. 如果数字为偶数, 直接传递给张飞
  • b. 如果数字为奇数, 数字扩大10倍后传递给张飞。
  • c. 输出 “曹操来了 n 万人”。(注意 n 的直)
  1. 张飞拿到数字, 直接输入 “曹操来了 n 万人”。

0 人点赞