以下四种命名方法是等价的:
- s := “”
- var s string
- var s = “”
- var s string = “”
那么什么时候用哪种而不用哪种,为什么?
第一种形式最简洁,但只能用在函数内部,不能用在包变量。
第二种形式依赖于字符串的默认初始化值,被初始化为""。
第三种形式用得很少,除非同时声明多个变量。
第四种形式显式地标明变量的类型,当变量类型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须了。
实践中一般使用前两种形式中的某个,初始值重要的话就显式地指定变量的类型,否则使用隐式初始化。
package mainimport ("fmt""os"
)func main() {s, sep := "", ""for _, arg := range os.Args[1:] {s += sep + argsep = " "}fmt.Println(s)
}
这是一个简单的字符串拼接语句,可以看到每次循环迭代字符串s的内容都会更新。
+=连接原字符串、空格和下个参数,产生新字符串, 并把它赋值给s。s原来的内容已经不再使用,将在适当时机对它进行垃圾回收。
但是,这种字符串拼接的方法在数据数据量很大时会产生高昂的空间代价。
重点
一种简单且高效的解决方案是使用strings包的Join函数:
func main() {fmt.Println(strings.Join(os.Args[1:], " "))
}