GitHub地址
实验准备
1、安装和导入pflag
使用 go get
命令就可以安装pflag包
go get github.com/spf13/pflag
go test github.com/spf13/pflag
import "github.com/spf13/pflag"
flag和pflag都是源自于Google,工作原理和代码实现基本上都是一样的。 flag虽然是Golang官方的命令行参数解析库,但是pflag却得到更加广泛的应用。 因为pflag相对flag支持更加精细的参数类型,例如flag只支持uint和uint64,而pflag额外支持uint8、uint16、int32。pflag支持更多参数类型:ip、ip mask、ip net、count、以及所有类型的slice类型,例如string slice、int slice、ip slice等。所以pflag的使用与flag基本是相同的。
实验过程
1、引入需要的包并定义
import(
"io"
"os"
"fmt"
"bufio"
"log"
"os/exec"
"bytes"
"github.com/spf13/pflag"
)
type Selpg struct {
startPage, endPage, pageLines, totalPages int
destination, inputFile string
fromFeed bool
}
2、判断有无输入文件的函数
if sp.inputFile != "" {
file, err := os.Open(sp.inputFile)
if err != nil {
fmt.Printf("%v: Could not open file: %v, %v\n", os.Args[0], sp.inputFile, err)
os.Exit(1)
}
reader = file
}
else {
reader = os.Stdin
}
bufReader := bufio.NewReader(reader)
bufWriter := bufio.NewWriter(writer)
var totalPages int
3、判断分页方式函数
if sp.fromFeed {
currentPage := 1
for runningFlag := true; runningFlag ;{
ch, err := bufReader.ReadByte()
if err != nil {
if err == io.EOF {
runningFlag = false
}
else {
log.Fatalf("Error: %v\n", err)
os.Exit(1)
}
}
if currentPage >= sp.startPage && currentPage <= sp.endPage {
bufWriter.WriteByte(ch)
}
if ch == '\f' {
bufWriter.Flush()
currentPage += 1
}
}
totalPages = currentPage
}
else {
currentLine := 1
for runningFlag := true; runningFlag ;{
line, err := bufReader.ReadString('\n')
if err != nil {
if err == io.EOF {
runningFlag = false
} else {
log.Fatalf("Error: %v\n", err)
os.Exit(1)
}
}
if currentLine >= sp.pageLines*(sp.startPage-1)+1 &&
currentLine <= sp.totalPages * sp.pageLines {
bufWriter.WriteString(line)
}
bufWriter.Flush()
currentLine += 1
}
totalPages = currentLine / sp.pageLines + 1
}
4、判断页数是否错误
if totalPages < sp.startPage {
err = errors.New(fmt.Sprintf("start_page (%v) greater than total pages (%v), no output written", sp.startPage, totalPages))
} else if totalPages < sp.endPage {
err = errors.New(fmt.Sprintf("end_page (%v) greater than total pages (%v), less output than expected", sp.endPage, totalPages))
}
bufWriter.Flush()
return err
实验结果
1、测试输出1-20行
测试程序
for ((i=1;i<20;i++))
do
echo "line" $i >> test
done
命令
$./selpg --s 1 --e 1 test
实验结果
2、测试复杂一点的
测试程序
for ((i=1;i<20;i += 4))
do
echo "line" $i >> testpage
echo "line" $i+1 >> testpage
echo "line" $i+2 >> testpage
echo "line" $i+3 >> testpage
echo -e '\f' >> testpage
done
命令
$./selpg --s 1 --e 3 testpage
实验结果
这样实验就完成了。