将 Go 作为脚本语言用及一些好用的包

前言

Go 作为一种可用于创建高性能网络和并发系统的编程语言,它的生态应用变得越来越广泛,同时,这也激发了开发人员使用 Go 作为脚本语言的兴趣。虽然目前 Go 还未准备好作为脚本语言 “开箱即用” 的特性,用来替代 Python 和 Bash ,但是我们只需要一点点准备工作就可以达到想要的目标。

Google 公司的软件工程师 Eyal Posener 为 Go 用作脚本语言提供了更多的理由,例如,丰富的标准库和语言的简洁性使得维护工作变得更加容易。

为了让 Go 编写的脚本在 shell 脚本程序中表现良好,Codenation 的工程师使用了许多有用的 Go 软件包:

  • github.com/fatih/color 是用于输出对应编码颜色的包。
  • github.com/schollz/progressbar 是用于为执行时间过久的任务创建进度条的包。
  • github.com/jimlawless/whereami 是用于捕获源代码的文件名、行号、函数等信息的包,这对于改正错误信息十分有用!
  • github.com/spf13/cobra 是用于更轻松地创建带有输入选项和相关文档的复杂脚本的包。

Hello

package mainimport ("fmt""os"
)func main() {fmt.Println("Hello", os.Args[1])os.Exit(42)
}

执行

$ go run example.go world
Hello world
exit status 42
$ echo $?
1

cobra

基本使用

package main  import (  "fmt"  "github.com/spf13/cobra"  "os"  
)  func main() {  // 创建根命令  var rootCmd = &cobra.Command{  Use:   "app",  Short: "应用程序描述",  Long:  `应用程序的详细描述,例如,它是用来做什么的`,  Run: func(cmd *cobra.Command, args []string) {  fmt.Println("欢迎使用 Cobra 应用程序!")  },  }// 创建一个子命令  var helloCmd = &cobra.Command{  Use:   "hello",  Short: "打印问候语",  Long:  `此命令将打印出问候语给你指定的名字`,  Run: func(cmd *cobra.Command, args []string) {  if len(args) > 0 {  fmt.Printf("你好, %s!\n", args[0])  } else {  fmt.Println("你好, 世界!")  }  },  }  // 将子命令添加到根命令  rootCmd.AddCommand(helloCmd)  // 执行根命令  if err := rootCmd.Execute(); err != nil {  fmt.Println(err)  os.Exit(1)  }  
}

执行

go run main.go          # 输出: 欢迎使用 Cobra 应用程序!  
go run main.go hello    # 输出: 你好, 世界!  
go run main.go hello John  # 输出: 你好, John!  

参数介绍

  1. cmd := &cobra.Command{}:创建一个新的命令对象。可以设置命令的名称、简短描述、详细描述、执行函数等。

    • cmd.Use:设置命令的名称和用法。
    • cmd.Short:设置命令的简短描述。
    • cmd.Long:设置命令的详细描述。
    • cmd.Run:设置命令的执行函数。
  2. rootCmd.AddCommand(cmd1, cmd2,...):将多个子命令添加到根命令中。

  3. cmd.Flags().StringP("paramName", "p", "defaultValue", "description"):添加一个字符串类型的命令行参数,带有短名称(-p)和长名称(–paramName)。可以指定默认值和参数描述。

  4. cmd.Flags().IntP("intParam", "i", 0, "description"):添加一个整数类型的命令行参数。

  5. cmd.Flags().BoolP("boolParam", "b", false, "description"):添加一个布尔类型的命令行参数。

  6. err := cmd.Execute():执行命令。如果命令执行过程中出现错误,会返回一个错误对象。

progressbar

安装

go get -u github.com/schollz/progressbar/v3
bar := progressbar.Default(100)
for i := 0; i < 100; i++ {bar.Add(1)time.Sleep(40 * time.Millisecond)
}

执行的大致效果
在这里插入图片描述

资料

  • https://www.infoq.com/news/2020/04/go-scripting-language/
  • https://gist.github.com/posener/73ffd326d88483df6b1cb66e8ed1e0bd
  • https://go.dev/blog/survey2019-results
  • https://github.com/spf13/cobra
  • https://github.com/schollz/progressbar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544132.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Perf为性能分析工具&#xff0c;依赖PMU&#xff08;Per…

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中&#xff0c;我们想打印空格并不能直接敲一个空格键&#xff0c;因为如果是敲空格键&#xff0c;那无论你敲…

2万字长文超全详解!深度学习时代阴影检测、去除与生成在图像与视频中的全面综述

论文链接&#xff1a;https://arxiv.org/pdf/2409.02108 Github链接&#xff1a;https://github.com/xw-hu/Unveiling-Deep-Shadows 亮点直击 深度学习时代阴影分析的全面综述。本文对阴影分析进行了深入的综述&#xff0c;涵盖了任务、监督级别和学习范式等各个方面。本文的分…

SpringBoot整合ELK实现日志监控(保姆级教程)

新建SpringBoot项目 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

虚幻引擎的三种输入模式和将控件显示到屏幕上

首先要知道一个概念 , HUD 和 Input 都是由 PlayerController 来控制的 而虚幻的Input控制模式有三种 Set Input Mode Game Only (设置输入模式仅限游戏): 视角会跟着鼠标旋转 , 就是正常游戏的模式 , 这也是游戏默认输入模式 Set Input Mode UI Only (设置输入模式仅限UI): …

231. 2 的幂 简单递归 python除法的类型

已解答 简单 相关标签 相关企业 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&…

傅里叶变换(对称美)

傅里叶变换&#xff08;对称美&#xff09; 冲浪时发现的有趣文章&#xff0c;学习自https://zhuanlan.zhihu.com/p/718139299 摘下来的内容&#xff1a; 傅里叶变换之所以“怪美的嘞”&#xff0c;根本在于它有一种内在的对称性&#xff0c;这一点在上面的图并没有表现出来…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么&#xff1f; 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能&#xff1a;如高温、电弧、电火花以及非故障性释放的能量&#xff1b;如电热器具的炽热表面&#xff0c;在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

移动端列表筛选封装

适合场景&#xff1a;Vue2vant 移动端项目&#xff0c;数据填充添加全部选项及相关逻辑处理&#xff0c;支持多选、单选以及筛选状态返回 效果图 选中交互 使用说明 <filter-box ref"filterBox" :isMultiple"true" //是否多选:params"waitData&q…

为什么无线物联网通信技术是智能家居的首选

无线物联网通信技术成为智能家居的首选&#xff0c;主要基于以下几个方面的原因&#xff1a; 一、便捷性与灵活性 无需布线&#xff1a;无线物联网通信技术最大的优势在于其无需复杂的布线工作。在智能家居系统中&#xff0c;这意味着用户无需在墙壁中开凿线路&#xff0c;也无…

夜间红外图宠物检测系统源码分享

夜间红外图宠物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

如何使用VM中win10搭建Hfish蜜罐(危险感知平台)。从下载到部署详细教程

得而不惜就该死。 -----古月方源 引言&#xff1a;最近跟一个老师做东西&#xff0c;叫我搞清楚蜜罐的搭建和一些底层逻辑&#xff0c;所以记录一下。 一、实验准备 &#xff08;一&#xff09;win10虚拟机 &#xff08;若有需要可以后台私信&#xff09; &#xff08;二&…

库仑定律-库仑力-两个电荷之间静电力的计算公式

图中&#xff1a; q1&#xff0c;q2 为两个电荷r 为电荷间的距离 r ^ 1 , 2 \widehat{r}_{1,2} r 1,2​ 为从 q1 指向 q2 的单位向量 F ⃗ 1 , 2 \vec{F}_{1,2} F 1,2​ 为 q1 施加到 q2 上的静电力 公式&#xff1a; F ⃗ 1 , 2 q 1 q 2 K r 2 r ^ 1 , 2 \vec{F}_{1,2} \f…

WordPress精选文章如何添加侧边栏和页面?

WordPress精选帖子是一项功能&#xff0c;可让用户在其网站主页或其他值得注意的部分突出显示特定帖子。这些精选帖子通常以视觉上独特的方式显示&#xff0c;例如以滑块、网格或轮播格式显示&#xff0c;以提高其可见性和对访问者的吸引力。 网站所有者可以手动选择他们想要推…

合规性强化:等保测评中的政策与标准遵循

在信息化高速发展的今天&#xff0c;信息安全已成为国家安全的重要组成部分&#xff0c;而等级保护测评&#xff08;简称“等保测评”&#xff09;作为确保信息系统安全的重要手段&#xff0c;其合规性强化显得尤为重要。等保测评不仅是对信息系统安全性能的全面评估&#xff0…

并发编程工具集——Fork/Join-上(三十六)

简述 前面提到的线程池、Future、CompletableFuture 和 CompletionService&#xff0c;这些工具类都是在帮助我们站在任务的视角来解决并发问题&#xff0c;而不是让我们纠缠在线程之间如何协作的细节上&#xff08;比如线程之间如何实现等待、通知等&#xff09;。精髓&#x…

Angular由一个bug说起之十:npm Unsupported engine

我们在用npm下载包的时候&#xff0c;有时候会碰到这样的提示 这是npm的警告&#xff0c;说我们使用的nodejs版本与下载的包所要求的nodejs版本不一致。 这是因为有些包它对nodejs的版本有要求&#xff0c;然后就会在package.json文件里的engines字段里声明它所要求的nodejs版本…

【SemeDrive】【X9HP】【PTG4.3】解决Partition Flash Error及PTG4.3二级分区烧录与升级问题

前言&#xff1a;PTG4.1 之前的版本使用的都是普通 emmc 和 一级分区表&#xff0c;PTG4.3 新增了 virtio-eMMC 功能和二级分区表的设置&#xff0c;因此关于 PTG4.3 的烧录和升级有以下几个疑问和解答。 一、名词解释 virtio-eMMC&#xff1a;基于 Virtio 框架的虚拟化 EMMC…

Java面试篇基础部分-Semaphore及其用法详解

Semaphore 是一种基于计数的信号量&#xff0c;在定义信号量对象的时候可以设置一个阈值&#xff0c;然后基于这个阈值&#xff0c;多线程可以竞争访问信号量&#xff0c;线程竞争到许可的信号之后&#xff0c;开始执行具体的业务逻辑&#xff0c;业务逻辑在执行完成之后释放这…

并发编程工具集——CompletionService(三十五)

利用 CompletionService 实现 Dubbo 中的 Forking Cluster Dubbo 中有一种叫做 Forking 的集群模式&#xff0c;这种集群模式下&#xff0c;支持并行地调用多个查询服务&#xff0c;只要有一个成功返回结果&#xff0c;整个服务就可以返回了。例如你需要提供一个地址转坐标的服…