Go标准库之strings

数据结构

strings.Builder

strings.Builder结构体用于构建字符串。
与string值相比优势主要体现在字符串拼接方面,string拼接的结果是生成新的string,需要把原字符串拷贝到新的string中;Builder底层存在[]byte,按需扩容,不必每次都进行拷贝

对于非空的strings.Builder复制会引发panic

1
2
3
4
5
实现接口
builder := new(strings.Builder)
_ = interface{}(builder).(io.Writer)
_ = interface{}(builder).(io.ByteWriter)
_ = interface{}(builder).(fmt.Stringer)

strings.Reader

strings.Reader结构体用于读取字符串
Reader的优势是维护了一个已读计数器,知道下一次读的位置,读取速度更快

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Reader.Read
Reader.ReadAt
Reader.ReadByte
Reader.ReadRune
Reader.Size
Reader.Len
Reader.UnreadByte
Reader.UnreadRune
Reader.WriteTo
实现接口
reader := strings.NewReader("")
_ = interface{}(reader).(io.Reader)
_ = interface{}(reader).(io.ReaderAt)
_ = interface{}(reader).(io.ByteReader)
_ = interface{}(reader).(io.RuneReader)
_ = interface{}(reader).(io.Seeker)
_ = interface{}(reader).(io.ByteScanner)
_ = interface{}(reader).(io.RuneScanner)
_ = interface{}(reader).(io.WriterTo)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//strings.Builder
var s strings.Builder
s.WriteString("hello")
s.WriteString(" ")
s.WriteString("world")
fmt.Printf("%s", s.String())
s2 := s
fmt.Printf("%s", s2.String())
//s2.WriteString("trigger panic") 复制触发panic
//strings.Reader
reader := strings.NewReader("hello world")
buf := make([]byte, 20)
n, err := reader.Read(buf)
if err != nil {
fmt.Println(err)
}
fmt.Printf("read size %d", n)

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
字符串比较
strings.Compare 比==更快
stirngs.EqualFold 以utf8编码解析且无视大小写的条件下比较字符串
//包含
strings.Contains
strings.ContainsAny s包含sub中任何字符,返回true
stirngs.ContainsRune unicode字符是否在s中
strings.Count sub在s中的出现次数
分割/组装
strings.Fields 以空格分隔字符串,返回切片
strings.FieldsFunc
strings.Join 组合切片,返回字符串
strings.Split 以字符串分割字符串,返回切片
//前缀 后缀
strings.HasPrefix 拥有前缀
strings.HasSuffix 拥有后缀
//查找
strings.Index 查找子串sub所在位置
strings.IndexByte 查找字符在s中所在位置
strings.IndexRune 查找unicode字符在s中所在位置
strings.LastIndex 查找子串sub在s中最后出现位置
strings.LastIndexByte
strings.LastIndexAny 查找子串任意字符在s中最后出现位置
strings.LastIndexFunc 查找子串符合条件