服务计算Homework03
- 项目地址
- 使用说明:根据博客内容配置好环境后,在对应
goPath/src
中创建selpg/selpg.go
,完成代码后在goPath/src/selpg
中执行go build
生成selpg
文件,即可在当前路径下使用selpg xxx
对应命令
目的
使用 golang 开发开发 Linux 命令行实用程序中的 selpg
要求
- 请按文档使用 selpg 章节要求测试你的程序
- 请使用 pflag 替代 goflag 以满足 Unix 命令行规范, 参考:Golang之使用Flag和Pflag:
- golang 文件读写、读环境变量,请自己查 os 包
- “-dXXX” 实现,请自己查 os/exec 库,例如案例Command,管理子进程的标准输入和输出通常使用 io.Pipe,具体案例见Pipe
- 请自带测试程序,确保函数等功能正确
环境配置
- Linux配置go语言环境
- 使用命令行
apt install golang
安装的go语言没有pflag
库,手动安装命令为go get github.com/spf13/pflag
,安装好后可以直接import
代码实现
- 参数结构体selpg_args
将page_type改为bool类型,因为pflag是要识别选项后面跟着的参数的,但-f后面不跟参数,如果用整数类型会报错,而布尔类型的一个特点是不能直接在选项后面跟参数,如果要跟参数,必须用一个等号连接,如
selpg -s1 -e2 -f=true
,如果出现-f
也相当于-f=true
,所以如果没有出现-f选项,则page_type为默认值false(对应定长72行数),如果出现-f选项,则page_type
设为true
(对应不定长行数)。其他与c语言版本相同
type selpg_args struct {
start_page int
end_page int
page_len int
page_type bool
in_filename string
print_dest string
}
- 获取参数
由课件可得os、flag包的参数简单处理为:
package main
import (
"fmt"
"os"
)
func main() {
for i, a := range os.Args[1:] {
fmt.Printf("Argument %d is %s\n", i+1, a)
}
}
package main
import (
"flag"
"fmt"
)
func main() {
var port int
flag.IntVar(&port, "p", 8000, "specify port to use. defaults to 8000.")
flag.Parse()
fmt.Printf("port = %d\n", port)
fmt.Printf("other args: %+v\n", flag.Args())
}
仿写上述代码获取参数如下
func get_args(sa selpg_args) {
progname = os.Args