String
在 Go 语言中, 字符串是基础数据类型之一, 关键字为 string
.
变量声明
字符串变量的声明如下:
// 声明一个字符串类型的变量 s, 未赋予初始值时默认为零值 ""
var s string
// 当然也可以用短声明, 让编译器自动推导类型, 不过需要在定义时明确赋予初始值.
s := ""
零值
字符串的零值是 ""
原始字符串
在实际应用的过程中, 有些字符串会需要比较长, 我们需要保留其原来的格式和内容以便开发和维护查看. 比如 json/xml/sql 等.
Go 中提供了让你书写原始字符串的方式, Raw String
var rawStr1 = ``
var xmlStr1 = `
<xml>
<node></node>
</xml>
`
var sql = `
SELECT *
FROM table
`
var json = `
{
"key": "value"
}
`
var multilineStr = `
1234567890
~!@#$%^&*()_+|
abcABC
`
常用操作
// 字符串分割
s := "a-b-c"
a := strings.Split(s, "-") // 返回字符串切片
// [a b c]
// 字符串叠加
a := []string{"a", "b", "c"}
s := strings.Join(a, "-") // 返回字符串
// a-b-c
// 清除字符串左右2端的所有空字符
s := " a b c "
s = strings.TrimSpace(s)
// s = a b c
关于更多字符串操作方法可以查看标准库 strings…
类型转换
// 字符串转数值
s := "10"
i, err := strconv.Atoi(s)
// i = 10
// 数值转字符串
i := 99
s := strconv.Itoa(i)
// s = "99"
// 接口对象转字符串
var a interface{}
a = "str"
s := a.(string)
// s = "str"
关于更多字符串转换方法可以查看标准库 strconv…
性能比较
字符串的用途非常广泛, 那么字符串操作的性能是我们必须去考量的东西.
这里介绍几种常见的字符串连接方式, 并通过基准测试来获取我们需要的答案:
// string_contcat_test.go
package string
import (
"bytes"
"fmt"
"strings"
"testing"
)
// using +=
func BenchmarkStringAdd(b *testing.B) {
b.ResetTimer()
s := ""
for i := 0; i < b.N; i++ {
s += "s"
}
b.StopTimer()
}
// using Sprintf
func BenchmarkSprintf(b *testing.B) {
b.ResetTimer()
s := "s"
for i := 0; i < b.N; i++ {
s = fmt.Sprintf("%v", s)
}
b.StopTimer()
}
// using strings.Builder
func BenchmarkStringsBuilder(b *testing.B) {
b.ResetTimer()
var stringsBuilder strings.Builder
s := "s"
for i := 0; i < b.N; i++ {
stringsBuilder.WriteString(s)
}
_ = stringsBuilder.String()
b.StopTimer()
}
// using bytes.Buffer
func BenchmarkBytesBuffer(b *testing.B) {
b.ResetTimer()
s := "s"
var bytesBuffer bytes.Buffer
for i := 0; i < b.N; i++ {
bytesBuffer.WriteString(s)
}
_ = bytesBuffer.String()
b.StopTimer()
}
//
go test -v -bench=.
/*
goos: windows
goarch: amd64
pkg: gitee.com/taadis/letgo/_examples/keywords/string
BenchmarkStringAdd-4 600320 48977 ns/op
BenchmarkSprintf-4 9096511 129 ns/op
BenchmarkStringsBuilder-4 211771195 5.40 ns/op
BenchmarkBytesBuffer-4 100000000 11.8 ns/op
PASS
ok gitee.com/taadis/letgo/_examples/keywords/string 36.108s
*/
一个简单的基准测试可以得出以下结论: (字符串拼接性能从高到底)
strings.Builder
bytes.Buffer
fmt.Sprintf()
+
实际使用中的话, 各自取舍吧….