GO语言基础学习实践 | 青训营

67 阅读2分钟

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()获取读入值,完成读取功能。