DevopsCamp(第一期): 《cobra - 01 实现编译与参数绑定(简单)》
DevopsCamp 第一期作业: 《cobra - 01 实现编译与参数绑定(简单)》 解题答案
原文链接: https://tangx.in/posts/2023/0...
本文为 DevOpsCamp
实战训练的作业解题答案 作业: cobra - 01 实现编译与参数绑定。
DevOpsCamp作业地址: https://www.devopscamp.cc/sem...
作业要求:
- 使用 https://github.com/spf13/cobra 实现命令工具
命令具有以下参数
--name
姓名--age
年龄
- 如果年龄为空, 默认为 20 岁。
- 完成交叉编译脚本, 编译其他平台的二进制文件
-rwxr-xr-x 1 franktang staff 4220672 Jan 13 15:35 greeting-darwin-amd64
-rwxr-xr-x 1 franktang staff 4203442 Jan 13 15:35 greeting-darwin-arm64
-rwxr-xr-x 1 franktang staff 4215010 Jan 13 15:35 greeting-linux-amd64
-rwxr-xr-x 1 franktang staff 4157892 Jan 13 15:35 greeting-linux-arm64
- 执行输出效果如下
$ ./out/greeting-darwin-arm64
你好, 今年 20 岁
$ ./out/greeting-darwin-arm64 --age 30 --name zhangsan
zhangsan 你好, 今年 30 岁
解题过程
1. 安装依赖包
$ go get -u github.com/spf13/cobra
2. 创建命令
var root = &cobra.Command{
Use: "greeting", // 命令名字
Short: "打招呼", // 短介绍
Run: func(cmd *cobra.Command, args []string) { // 运行函数
greeting(name, age)
},
}
3. 指定参数
- 定义了变量作为参数接受者。
使用 init 函数, 在程序初始化的时候, 传递参数值。
- 参数接受者 指针类型
- 参数名称, 字符串类型
- 短参数名称, 字符串类型, 但只接受一个参数
- 默认值, 具体类型
- 参数描述, 字符串类型
var (
name = ""
age = 0
)
func init() {
root.Flags().StringVarP(&name, "name", "", "", "姓名")
root.Flags().IntVarP(&age, "age", "", 20, "年龄")
}
4. 调用执行
- greeting 是程序实际执行逻辑, 及执行逻辑入口。
- 在 root 的 Run 中调用 执行逻辑入口。
- 在 main 中调用 root 的执行函数 Execute()
func greeting(name string, age int) {
fmt.Printf("%s 你好, 今年 %d 岁\n", name, age)
}
var root = &cobra.Command{
Use: "greeting",
Short: "打招呼",
Run: func(cmd *cobra.Command, args []string) {
greeting(name, age) // 2. root 命令调用 greeting 业务
},
}
func main() {
err := root.Execute() // 3. main 调用 root 命令
if err != nil {
log.Fatal(err)
}
}
4. 使用 Makefile 进行编译管理
- 使用
GOOS
和GOARCH
设置环境变量命令。 使用
build
命令, 使用进行 当前系统环境 的编译- 并且编译文件命名包含系统信息。
- 使用
buildx
命令, 实现 交叉编译 - 使用
clean
命令清空编译结果。
## 默认变量, 获取当前 go 的环境变量
GOOS ?= $(shell go env GOOS)
GOARCH ?= $(shell go env GOARCH)
## build 在指定环境变异
build:
go build -o out/greeting-$(GOOS)-$(GOARCH) .
## 通过指定环境变量, 执行交叉编译
buildx:
GOOS=linux GOARCH=amd64 make build
GOOS=linux GOARCH=arm64 make build
GOOS=darwin GOARCH=amd64 make build
GOOS=darwin GOARCH=arm64 make build
## 清理编译结果
clean:
rm -rf out/
一个最基本命令结构就这样完成了, 是不是很简单?
B站作业视频
https://www.bilibili.com/vide...
DevOpsCamp
[链接]
推荐阅读
一款 k8s kubectl 命令 “人话” 翻译插件!! 离升空操作只有一步之遥
Kubectl OpenAI插件 ✨原文链接: [链接]该项目是一个kubectl插件,使用OpenAI GPT生成和应用Kubernetes清单。我的主要动机是避免在开发/测试时找到和收集随机清单。下载地址官方首页: [链接]用法先决条件kubectl-a...
老麦阅读 567
又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。
良许赞 6阅读 1.9k
「刷起来」Go必看的进阶面试题详解
逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分配和垃圾回收的开销,从而提高程序的性能。下面是一道涉及逃逸分析的面试题及其详解。
王中阳Go赞 4阅读 2k评论 1
关于 Ubuntu 20.04 LTS 的网络(dchp/dns/route/PPPoE)
前言旧时代网络管理软件 net-tools、NetworkManager新时代网络管理软件 iproute2、resolvectl新时代旧时代大致可按 2010 年划分检查网卡是否已插入网线直接查看文件 {代码...} ip addr 或 ip link 命令查看网卡状...
qbit赞 2阅读 15k
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。
王中阳Go赞 4阅读 1.8k评论 2
一分钟搞明白!快速掌握 Go WebAssembly
最近因为各种奇怪的原因,更多的接触到了 WebAssembly。虽然之前很多博客也翻过写过各种文章,但总感觉欠些味道。于是今天梳理了一版,和大家一起展开学习。
煎鱼赞 4阅读 2.3k
突破难关:Docker镜像和容器的区别以及构建的最佳实践
Docker 可谓是开启了容器化技术的新时代,现在无论大中小公司基本上都对容器化技术有不同程度的尝试,或是已经进行了大量容器化的改造。伴随着 Kubernetes 和 Cloud Native 等技术和理念的普及,也大大增加了业务...
张晋涛赞 4阅读 1.2k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。