1.命令行参数
import (
"fmt"
"os"
)
func main() {
var s, sep string
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
fmt.Println(s)
}
上述例子中通过os包提供的Args字符串slice获得命令行参数,其中Args[0]为命令本身名字,表达式Args[m:n]表示从第m个到第n-1个元素的slice,如果m或n缺失,则默认分别为0或len(s),所以上述例子中的Args[1:]等于Args[1:len(os.Args)]
同时注意range关键字,每一次迭代过程中range产生一对值:索引和索引对应的值,本例子中不需要用到索引,所以可以用空标识符_来舍弃不需要的索引
import (
"fmt"
"os"
"strings"
)
func main() {
fmt.Println(strings.Join(os.Args[1:], " "))
}
上述例子是对第一个例子的优化,在原例子中使用+=语句对于原字符串进行更新,但每次执行+=语句都会重新申请一个新字符串内存,同时对旧字符串内存进行垃圾回收。当处理大量的数据时,使用这种方法会造成大量的内存申请与回收,代价过大,所以我们可以用strings包中的Join函数,Join函数会将第一位参数字符串slice中的元素进行拼接,第二位参数为拼接中的分隔符
2.获取输入字符并记录该字符行存在次数
import (
"bufio"
"fmt"
"os"
)
func main() {
counts := make(map[string]int)
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
counts[input.Text()]++
}
for line, n := range counts {
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
}
}
上述代码通过map对输入的字符串进行存储,通过make函数创建一个key为字符串类型,value为int类型的map,通过bufio提供的Scanner获取输入的字符串,最后将获得的字符串作为key值存进map中记录该字符串出现的次数,最后通过range获取counts中记录的数据。其中Scanner被称为扫描器,可以读取输入,以行或者单词为单位断开,每次调用input.Scan()读取下一行并将结尾的换行符去掉,通过input.Text()获取读入值,完成读取功能。