Parse Command Line Arguments and Flags in Golang
Golang 中用 os.Args 来访问命令行参数,它相当于 C 语言中的 char *argv[]。如我们可以用它来实现一个 echo 程序:
package main
import (
"fmt"
"os"
)
func main() {
for _, arg := range os.Args[1:] {
fmt.Printf("%s ", arg)
}
fmt.Println()
}
Golang 中还提供了处理命令行 flag 的方法,这些方法位于 flag package 中。比如下面的程序提供了一个 -port 的
命令行 flag,用来指定 server 监听的端口:
package main
import (
"flag"
"fmt"
"io"
"log"
"net"
"time"
)
var port *int
func init() {
port = flag.Int("port", 8000, "port the server will listen to")
flag.Parse()
}
func main() {
ipport := fmt.Sprintf("localhost:%d", *port)
listener, err := net.Listen("tcp", ipport)
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
continue
}
go handleConn(conn)
}
}
func handleConn(c net.Conn) {
defer c.Close()
for {
_, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
if err != nil {
return
}
time.Sleep(1 * time.Second)
}
}
port = flag.Int("port", 8000, "port the server will listen to")
这一行中,flag.Int 用来设置 -port flag,其中,方法名 Int 代表的是 flag 的类型为 int,第一个参数为 flag 名,这里是 port,
第二个参数为默认值,这里是 8000,第三个参数是 flag 的描述,是当你输入 ./server -h 或 ./server --help 的时候输出
的内容,这里写的是 "port the server will listen to"。
这里给出的是一个 int 类型的命令行 flag,其实其他类型的 flag 定义的方法和这个大同小异,比如我们可以定义一个 string 类型的
flag ip:
ip := flag.String("ip", "localhost", "server's ip")
不管是 flag.Int 还是 flag.String,它们返回的都是对应类型的指针变量,如 *int 和 *string。而且这些变量只有在经过
flag.Parse() 之后才能使用。
以上。