go语言之CLI 命令行实用程序开发基础

1、selpg简介

1.1 程序说明

selpg是一个命令行工具,全称是Select Pages,它允许用户从输入文本中抽取指定的页的范围,然后按行数或按分页符输出这些页,同时该命令还允许用户指定标准输出的位置。
selpg可以有选择性的查看或打印某个文档的部分内容,简单、高效、节约资源。

1.2 文件内容

文件名 作用
selpg.go 核心文件,selpg功能的实现代码
test 测试文件,有1001行数据,用于测试selpg的功能
output 可选的输出文件,用于测试selpg的输出重定向
error 可选的错误输出文件,用于测试selpg的错误输出重定向

1.3 输入样例

go run selpg.go -s num1 -e num2 [-f / -l page_len] [-d str] input_file

1.4 参数格式

参数 值类型 必选/可选 功能
-s int 必选 指定起始页码,默认为-1
-e int 必选 指定结束页码,默认为-1
input_file string 可选 指定输入文件,默认为空
-f bool 可选 指定解读模式为以分页符分页,不可与-l同时使用
-l int 可选 指定每页的行数,默认为每页72行
-d string 可选 指定打印机设备地址

2、selpg实现

具体的selpg实现是参照老师所给出的 开发 Linux 命令行实用程序 中的selpg的C语言实现版本 selpg.c 以及 标准库—命令行参数解析FLAG 中用flag编写命令行实用程序的例子。
实际上就是参照yonggo语言编写nginx的例子,将selpg.c翻译成go语言版本的selpg.go 。

2.1 参数结构体

为了方便对多个参数的管理,先定义一个用于接收参数的结构体。
此结构体具体有起始页码、结束页码、输入文件、页长度、页分隔类型、打印机地址等。

type Selpg struct{
   
	start_page int          //起始页数,从0开始计数
	end_page int            //终止页数
	in_filename string      //输入文件
	page_len int            //每页输出的长度(即行数,当以-f打印时此值设定为-1
	page_type bool			//打印文件的类型,其中true代表按分页符打印-f,false代表按行打印-l
	destination string      //输出终端
}

2.2 参数输入

这里主要是用flag包来做参数解析,用flag.XxxVar()来根据参数的参数类型来将值与具体参数绑定,还可以设置默认值和输入提示。
根据参照文件的内容,这里将-s -e -l -f -d的值直接绑定到变量。
特别的,要注意此处-l的默认值,如果直接设置成72,后面则没法判断-f和-l冲突与否的情况,一旦输入有-f就会显示-f与-l冲突。因此这里先将默认值改成-1,在后面若是没有用到-f模式则默认为要-l模式,再设为72。

	flag.Usage = usage
	flag.IntVar(&(selpg.start_page), "s", -1, "Start page")
	flag.IntVar(&(selpg.end_page), "e", -1, "End page")
	flag.IntVar(&(selpg.page_len), "l", -1, "Line per page")
	flag.BoolVar(&(selpg.page_type), "f", false, " Page type")
	flag.StringVar(&(selpg.destination), "d", "", "Print destination")
	flag.Parse()

2.3 参数检查

这里检查了6个可以在运行前判断错误的情况:

  • 未设定起止页码
  • 起止页码命令输入错误
  • 起止页码过小
  • 起止页码过大,溢出了
  • 起始页码大于结束页码
  • -l和-f冲突
func process_args(selpg *Selpg) {
   
    //未设定起止页码
	if selpg.start_page==-1 || selpg.end_page==-1{
   
		fmt.Fpri
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值