Go 中字符串本质是一个只读[]char,为了便于使用,Go 将其封装成基本类型string提供。

求字符串长度

Go 中也用len来求长度,但和 Python 不同的是,len返回的是字节数而非字符数。
可以将字符串转换为[]rune并求其长度,这样就可以得到字符串的字符数了。(虽然会浪费一部分空间,因为rune是 4 个字节)。 :::info UTF-8 是动态编码,英文用 1 个字节表示,中文用三个字节表示。 :::

  1. str := "hello,世界" // Go 语言字符串结尾没有 \0
  2. length := len(str)
  3. fmt.Println(length) // 12
  4. length = len([]rune(str))
  5. fmt.Println(length) // 8

关于中文字符

假设有一个字符串:

  1. str := "hello,世界"

我想输出“世”,有两种方法:

方法一:

  1. c := str[6:9] // 一个中文字符占 3 个字节
  2. fmt.Printf("%s\n", c)

方法二:

  1. d := []rune(str)[6]
  2. fmt.Printf("%c\n", d)

原始字符串

反引号定义的字符串中,所有内容保持原样,不进行转义。

  1. e := `1\t\n2`

字符串拼接

Go 中也可以用+拼接字符串。

  1. str := "hello" + " world"

字符串格式化

fmt.Printf()函数可以格式化输出字符串。指定格式的方式部分与 C 的printf相似,具体看老师笔记。

fmt.Sprintf()可以格式化字符串(并不会输出),函数的返回值是格式化后的字符串。

各种字符串常用操作(strings包)

  1. str := "hello,世界"
  2. _ = strings.Contains(str, "hello") // str 中是否包含子串 "hello"
  3. _ = strings.Index(str, "hello") // 查找子串
  4. _ = strings.Count(str, "l") // 统计子串出现次数
  5. _ = strings.HasPrefix(str, "he") // 是否以子串开头
  6. _ = strings.HasSuffix(str, "世界") // 是否以子串结尾
  7. _ = strings.ToUpper(str)
  8. _ = strings.ToLower(str)
  9. _ = strings.Compare("aaa", "aab") // 字符串的比较(从前向后比较 ascii 码),若 a < b,返回 -1,a > b 返回 1,相等则返回 0
  10. _ = strings.TrimSpace(str) // 去除前后空白
  11. _ = strings.Trim(str, "h \t\n") // 第二个参数指定要去除的字符集合
  12. _ = strings.TrimLeft(str, "h \t\n") // 只去除左边的
  13. _ = strings.Split(str, ",")
  14. _ = strings.Join(strArr, " ")
  15. _ = strings.Replace(str, "h", "H", 1) // 最后一个参数表示替换次数

与其他基本类型间的相互转换(strconv包)

Itoa 和 Atoi:整型和字符串互转

  1. var a3 int = 13
  2. var b3 string = strconv.Itoa(a3) // 整型转字符串
  3. c3, _ := strconv.Atoi(b3) // 字符串转整型

Parse 类函数:字符串转其他类型

  1. d3, _ := strconv.ParseBool("true")
  2. e3, _ := strconv.ParseBool("True") // 支持大写的
  3. f3, err := strconv.ParseBool("str") // 转换失败,err != nil,f3 的值为 false
  4. g3, _ := strconv.ParseFloat("3.14", 32) // 第二个参数指定转换为 float32 还是 float64
  5. h3, _ := strconv.ParseInt("12", 10, 64) // 第二个参数指定 多少进制。可以是 2~36 或 0
  6. i3, _ := strconv.ParseInt("0x12", 0, 64) // 如果第二个参数设置为 0,Go 会根据字符串的格式自己猜进制
  7. j3, _ := strconv.ParseUint("12", 10, 64)

Format 类函数:其他类型转字符串

  1. k3 := strconv.FormatBool(true)
  2. l3 := strconv.FormatFloat(3.14, 'E', -1, 64) // fmt 参数控制格式,具体见老师笔记;prec 控制精度
  3. m3 := strconv.FormatInt(42, 16) // 第二个参数是进制
  4. n3 := strconv.FormatUint(42, 16)