Go 中字符串本质是一个只读的[]char
,为了便于使用,Go 将其封装成基本类型string
提供。
求字符串长度
Go 中也用len
来求长度,但和 Python 不同的是,len
返回的是字节数而非字符数。
可以将字符串转换为[]rune
并求其长度,这样就可以得到字符串的字符数了。(虽然会浪费一部分空间,因为rune
是 4 个字节)。
:::info
UTF-8 是动态编码,英文用 1 个字节表示,中文用三个字节表示。
:::
str := "hello,世界" // Go 语言字符串结尾没有 \0
length := len(str)
fmt.Println(length) // 12
length = len([]rune(str))
fmt.Println(length) // 8
关于中文字符
假设有一个字符串:
str := "hello,世界"
我想输出“世”,有两种方法:
方法一:
c := str[6:9] // 一个中文字符占 3 个字节
fmt.Printf("%s\n", c)
方法二:
d := []rune(str)[6]
fmt.Printf("%c\n", d)
原始字符串
反引号定义的字符串中,所有内容保持原样,不进行转义。
e := `1\t\n2`
字符串拼接
Go 中也可以用+
拼接字符串。
str := "hello" + " world"
字符串格式化
fmt.Printf()
函数可以格式化输出字符串。指定格式的方式部分与 C 的printf
相似,具体看老师笔记。
fmt.Sprintf()
可以格式化字符串(并不会输出),函数的返回值是格式化后的字符串。
各种字符串常用操作(strings
包)
str := "hello,世界"
_ = strings.Contains(str, "hello") // str 中是否包含子串 "hello"
_ = strings.Index(str, "hello") // 查找子串
_ = strings.Count(str, "l") // 统计子串出现次数
_ = strings.HasPrefix(str, "he") // 是否以子串开头
_ = strings.HasSuffix(str, "世界") // 是否以子串结尾
_ = strings.ToUpper(str)
_ = strings.ToLower(str)
_ = strings.Compare("aaa", "aab") // 字符串的比较(从前向后比较 ascii 码),若 a < b,返回 -1,a > b 返回 1,相等则返回 0
_ = strings.TrimSpace(str) // 去除前后空白
_ = strings.Trim(str, "h \t\n") // 第二个参数指定要去除的字符集合
_ = strings.TrimLeft(str, "h \t\n") // 只去除左边的
_ = strings.Split(str, ",")
_ = strings.Join(strArr, " ")
_ = strings.Replace(str, "h", "H", 1) // 最后一个参数表示替换次数
与其他基本类型间的相互转换(strconv
包)
Itoa 和 Atoi:整型和字符串互转
var a3 int = 13
var b3 string = strconv.Itoa(a3) // 整型转字符串
c3, _ := strconv.Atoi(b3) // 字符串转整型
Parse 类函数:字符串转其他类型
d3, _ := strconv.ParseBool("true")
e3, _ := strconv.ParseBool("True") // 支持大写的
f3, err := strconv.ParseBool("str") // 转换失败,err != nil,f3 的值为 false
g3, _ := strconv.ParseFloat("3.14", 32) // 第二个参数指定转换为 float32 还是 float64
h3, _ := strconv.ParseInt("12", 10, 64) // 第二个参数指定 多少进制。可以是 2~36 或 0
i3, _ := strconv.ParseInt("0x12", 0, 64) // 如果第二个参数设置为 0,Go 会根据字符串的格式自己猜进制
j3, _ := strconv.ParseUint("12", 10, 64)
Format 类函数:其他类型转字符串
k3 := strconv.FormatBool(true)
l3 := strconv.FormatFloat(3.14, 'E', -1, 64) // fmt 参数控制格式,具体见老师笔记;prec 控制精度
m3 := strconv.FormatInt(42, 16) // 第二个参数是进制
n3 := strconv.FormatUint(42, 16)