1 字符串的概念

在Go语言中,字符串也是一种基本类型。
相比之下, C/C++语言中并不存在原生的字符串类型,通常使用字符数组来表示,并以字符指针来传递。

  1. var str string // 声明一个字符串变量
  2. str = "Hello world"
  3. ch := str[0]
  4. fmt.Println("str的长度:", len(str))
  5. fmt.Println("第一个字符是", ch)

字符串的内容可以用类似于数组下标的方式获取,但与数组不同,字符串的内容不能在初始化后被修改

  1. str := "Hello world" // 字符串也支持声明时进行初始化的做法
  2. str[0] = 'X' // 编译错误

编译器会报类似如下的错误:cannot assign to str[0]

2 字符串的遍历

(1) 字节数组遍历

  1. str := "Hello,世界"
  2. n := len(str)
  3. for i := 0; i < n; i++ {
  4. ch := str[i] // 依据下标取字符串中的字符,类型为byte
  5. fmt.Println(i, ch)
  6. }

(2) Unicode字符遍历

  1. str := "Hello,世界"
  2. for i, ch := range str {
  3. fmt.Println(i, ch)//ch的类型为rune
  4. }

在Go语言中支持两个字符类型,

  • byte (实际上是 uint8 的别名),代表UTF-8字符串的单个字节的值;
  • rune ,代表单个Unicode字符

出于简化语言的考虑,Go语言的多数API都假设字符串为UTF-8编码

3 字符串的常用操作

方法 介绍
len(str) 求长度
strings.Split(s, sep string) []string 分割
strings.Contains(s, substr string) bool 判断是否包含
strings.HasPrefix(s, prefix string) bool 前缀判断
strings.HasSuffix(s, suffix string) bool 后缀判断
strings.Index(s, substr string) int 子串第一次出现的位置
strings.LastIndex(s, substr string) int 子串最后一次出现的位置
strings.Join(a[]string, sep string) join操作
strings.Count(s, substr string) int s 中子串的个数。
strings.Trim(s, cutset string) string 去掉头尾的所有在cutset里的单个字符
strings.TrimLeft(s, cutset string) string 只去除左边的
strings.TrimPrefix(s, prefix string) string 去除指定前缀

4 字符串的拼接

(1) 原生”+”

  1. var s string
  2. s = "asong" + "真帅"

少量字符串拼接时效率高

(2) 字符串格式化函数fmt.Sprintf

实现原理是反射, 有性能损耗

  1. str := "asong"
  2. str = fmt.Sprintf("%s%s", str, str)

性能损耗大, 不适合拼接

(3) strings.join

strings.join方法可以将一个string类型的切片拼接成一个字符串,可以定义连接操作符

  1. baseSlice := []string{"asong", "真帅"}
  2. strings.Join(baseSlice, "")

最适合用于字符串拼接的, 是基于Strings.builder

(4) strings.builder

Go语言提供了一个专门操作字符串的库strings,
使用strings.Builder可以进行字符串拼接,
提供了writeString方法拼接字符串

  1. var builder strings.Builder
  2. builder.WriteString("asong")
  3. builder.String()

(5) bytes.Buffer

因为string类型底层就是一个byte数组,所以我们就可以Go语言的bytes.Buffer进行字符串拼接。
bytes.Buffer是一个一个缓冲byte类型的缓冲器,这个缓冲器里存放着都是byte。

  1. buf := new(bytes.Buffer)
  2. buf.WriteString("asong")
  3. buf.String()

(6) 切片append

  1. buf := make([]byte, 0)
  2. base = "asong"
  3. buf = append(buf, base...)
  4. string(base)