./example7 –help 得到的结果是:
Usage of ./example7:
example7 file1 file2 …
获取输入
?? 目前为止我们只是通过CLI输出了信息,但是不接受任何输入。我们可以基本的fmt.Scanf()来捕捉输入。
package main
import "fmt"
func main() {
var guessColor string
const favColor = "blue"
for {
fmt.Println("Guess my favorite color:")
if _, err := fmt.Scanf("%s", &guessColor); err != nil {
fmt.Printf("%s\n", err)
return
}
if favColor == guessColor {
fmt.Printf("%q is my favorite color!", favColor)
return
}
fmt.Printf("Sorry, %q is not my favorite color. Guess again.\n", guessColor)
}
}
bufio.Scanner
?? fmt.Scanf 对于简单的输入很有效,但是有时候我们可能需要一整行的数据。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
if line == "exit" {
os.Exit(0)
}
fmt.Println(line) // Println will add back the final '\n'
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
}
这是一个基本的echo程序,如果要退出直接输入exit即可。
一个基本的cat程序
?? 你应该用过很多次cat程序了。我们将会把这篇博客学到的只是融合在一起构建一个基本的cat程序。
package main
import (
"flag"
"fmt"
"io"
"os"
)
func main() {
flag.Usage = func() {
fmt.Printf("Usage of %s:\n", os.Args[0])
fmt.Printf(" cat file1 file2 ...\n")
flag.PrintDefaults()
}
flag.Parse()
if flag.NArg() == 0 {
flag.Usage()
os.Exit(1)
}
for _, fn := range flag.Args() {
f, err := os.Open(fn);
if err != nil {
panic(err)
}
_, err = io.Copy(os.Stdout, f)
if err != nil {
panic(err)
}
}
}
帮助
?? 对于帮助我们在上面已经讲了,但是还没有明确的定义
-h
–help
?? 上面这些都会触发help。
总结
??本篇博客中只是讲了一些CLI的基本用法。如果想要学习更多,可以查看这些包的godoc
其他的命令行库
?? 还有一些第三方库可以让写CLI程序更简单: