Go String

在 Go 语言中, 字符串是基础数据类型之一, 关键字为 string.

变量声明

字符串变量的声明如下:

// 声明一个字符串类型的变量 s, 未赋予初始值时默认为零值""
var s string
// 当然也可以用短声明, 让编译器自动推导类型, 不过需要在定义明确赋予初始值.
s := ""

零值

字符串的零值是 "".

常用操作

// 字符串分割
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: github.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      github.com/taadis/letgo/_examples/keywords/string       36.108s

*/

一个简单的基准测试可以得出以下结论: (字符串拼接性能从高到底)

  1. strings.Builder
  2. bytes.Buffer
  3. fmt.Sprintf()
  4. +

各自取舍吧....

猜你喜欢

转载自www.cnblogs.com/taadis/p/12361667.html