包含关系

  1. // 子串substr在s中,返回true
  2. func Contains(s, substr string) bool
  3. // chars中任何一个Unicode代码点在s中,返回true
  4. func ContainsAny(s, chars string) bool
  5. // Unicode代码点r在s中,返回true
  6. func ContainsRune(s string, r rune) bool

字符串转换

下面行为会出现数据越界,但是会返回最大值127

  1. func TestStrConInt(t *testing.T) {
  2. n, err := strconv.ParseInt("128", 10, 8)
  3. if err != nil {
  4. t.Log(err)
  5. }
  6. t.Log(n)
  7. }

strings.Builder

已存在的内容不可变,但可以拼接更多的内容;
减少了内存分配和内容拷贝的次数;
可将内容重置,可重用值。

strings.Reader

Reader 类型
看到名字就能猜到,这是实现了 io 包中的接口。它实现了

  1. io.Reader(Read 方法)
  2. io.ReaderAt(ReadAt 方法)
  3. io.Seeker(Seek 方法)
  4. io.WriterTo(WriteTo 方法)
  5. io.ByteReader(ReadByte 方法)
  6. io.ByteScanner(ReadByte 和 UnreadByte 方法)
  7. io.RuneReader(ReadRune 方法)
  8. io.RuneScanner(ReadRune 和 UnreadRune 方法)。

Reader 结构如下:

  1. type Reader struct {
  2. s string // Reader 读取的数据来源
  3. i int // current reading index(当前读的索引位置)
  4. prevRune int // index of previous rune; or < 0(前一个读取的 rune 索引位置)
  5. }

可见 Reader 结构没有导出任何字段,而是提供一个实例化方法:

  1. func NewReader(s string) *Reader
  1. sr := strings.NewReader("0123456789A")
  2. b := make([]byte, 5)
  3. for {
  4. n, err := sr.Read(b)
  5. if err != nil {
  6. fmt.Println(err)
  7. break
  8. }
  9. fmt.Printf("%d %q\n", n, b[:n])
  10. }