String
string是Golang的原生类型,具有以下特性:
- 只读,是一个不可改变的字节序列。所以,复制一个字符串的开销是很小的,同时,对字符串的操作会创建新的实例
- 用len()函数获取的是string的字节数,而不是rune字符数目
- 字符串可以进行(逐字节)比较
字符串拼接
这是对字符串非常常见的操作,而且,我们有许多方法对字符串进行拼接,但是效率以及书写的难易程度是不同的,所以至少应该掌握效率最高,以及书写效率最高的两种方式。
方式 | 举例 | 评价 |
---|---|---|
加号 | var str string = hello, + world |
书写起来最方便,但效率低下 |
fmt.Sprintf函数 | str := fmt.Sprintf(“%s%s”, hello, , world ) |
常用于将不同类型的变量拼接到字符串中 |
strings.Join函数:用于将[]string拼接成string | str := strings.Join([]string{hello, ,world }) |
|
使用bytes.Buffer | buf := bytes.NewBuffer(nil) buf.WriteString(“hello, “) buf.WriteString(“world”) // 简单用例,buffer的使用细节不赘述 | 操作的是byte切片,也许会在使用上带来一些类型转换的不便。 相比与strings包提供的方法,我们可操作的部分更多,可以实现更加灵活的需求 |
自己来拼接[]byte | var b []byte s := “hello” b = append(b, s…) str := string(b) | 在一篇博客中看到的方法,string…竟然可以得到byte |
使用copy函数复制 | copy函数是用于复制切片内容的,不过也可以用于string与[]byte | |
使用strings.Builder(从Go1.10开始) | var builder strings.Buidler builder.WriteString(“hello, world”) str := builder.String() | 直接操作string,且效率较高。相比bytes包提供的方法: - 屏蔽了对底层字节的访问 - 不要复制一个非空的builder! |
Links
- stackoverflow,这里面的回答都很不错,包括了对常用方法的介绍,以及copy方式的说明,并提供了benchmark代码作为证明。并且在Inanc Gumus的回答下,有人对他的benchmark测试方法提出了异议,十分有价值,值得深入