记得最早在学校机房学习 Java 时,照着书上的例子,写一个最简单 main 方法,当程序运行并在屏幕上打印出 hello world 时,内心竟有种莫名的激动,相信很多人都有这种经历吧。
不管学什么编程语言,都先从命令行程序搞起。
首先,我们来写一个 Go 语言版的 hello world 程序:
// hello.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
接下来,我们可以直接在命令行执行下面的命令来运行该程序:
$ go run hello.go
当然,也可以先将源代码编译成可执行文件,然后再运行可执行文件:
# 在当前目录会生成同名可执行文件
$ go build hello.go
# 运行可执行文件
$ ./hello
运行完程序,命令行会输出一个 hello world,对于刚入门的同学,这一刻兴奋的心情是难以言表的。
我们可不是这么轻易就满足的,接下来,我们还要接收命令行参数并打印出来,趁着刚才的兴奋劲儿再写一段程序:
// args.go
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Args[:]);
}
上面的代码看上去很简单,却多了些奇怪的写法。首先,我们新引入了一个 os 包,然后又多了个 os.Args[:] 这样的写法。
os 是操作系统相关功能包,os.Args 表示命令行参数,它的类型是 []string 字符串切片,我们通过 os.Args[:] 获取所有命令行参数,其中第一个是当前执行的文件,后面是额外指定的参数。
这些知识点后续也会深入介绍,现在先不管他三七二十一,跑一跑遛遛再说。
编译后运行可执行文件:
$ ./args hello world
# 输出结果
[./args hello world]
一般来说,我们真正需要的是从第二个位置开始的参数,下面程序利用 len() 函数获取切片的长度,然后使用 for 循环从索引为 1 的地方开始取值,取出的值以连字符分隔开:
// args.go
package main
import (
"fmt"
"os"
)
func main() {
// 声明后默认值是空字符串
var str, sep string
for i := 1; i < len(os.Args); i++ {
str += sep + os.Args[i]
sep = "-"
}
fmt.Println(str)
}
再次编译后运行:
$ ./args hello world
# 输出结果
hello-world
我们还可以先利用 os.Args[1:] 获取到所需的参数集,然后使用 range 来遍历参数集:
// args.go
package main
import (
"fmt"
"os"
)
func main() {
// 声明并初始化的简写方式
str, sep := "", ""
// range会产生{index, value} 这里不需要index
for _, arg := range os.Args[1:] {
str += sep + arg
sep = "-"
}
fmt.Println(str)
}
最后,我们还可以引入 strings 包,使用 strings.Join() 方法,将参数集以指定字符分隔开:
// args.go
package main
import (
"fmt"
"os"
"strings"
)
func main() {
fmt.Println(strings.Join(os.Args[1:], "-"));
}
现在,我们已经学会好几种“回字”的写法了。????