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测试方法提出了异议,十分有价值,值得深入