[js go]字符串

128 阅读2分钟

byte和rune

遍历打印字符串, 我们会发现字符串有两种类型表示方式

str := "你好, peppa pig!"
fmt.Println("byte ASCII")
// for循环, 同js, 无小括号
for i := 0; i < len(str); i++ {
    fmt.Printf("%v->%c ", str[i], str[i]) 
}
fmt.Println()
fmt.Println("rune UTF-8")
// range迭代key和value
for _, r := range str {
    fmt.Printf("%v->%c ", r, r) 
}
// 输出
// byte ASCII
// 228->ä 189->½ 160->  229->å 165->¥ 189->½ 44->, 32->  112->p 101->e 112->p 112->p 97->a 32->  112->p 105->i 103->g 33->! 
// rune UTF-8
// 20320->你 22909->好 44->, 32->  112->p 101->e 112->p 112->p 97->a 32->  112->p 105->i 103->g 33->! 

byte类型, 即uint8, 代表一个ASCII字符

rune类型, 即int32, 代表一个UTF-8字符

字符串操作

修改字符

fmt.Println()
s1 := "peppa pig"
byteS1 := []byte(s1) // 强制转换类型
byteS1[0] = 'b'
fmt.Print(string(byteS1)) // beppa pig
fmt.Println()

s2 := "小猪佩奇"
byteS2 := []rune(s2)
byteS2[0] = '粉'
fmt.Println(string(byteS2)) // 粉猪佩奇

获取字符串长度

s3 := "你好"
fmt.Println(len(s3)) // 6, byte的长度

字符串拼接

s4 := ",佩奇"
s5 := s3 + s4
fmt.Println(s5) // 你好,佩奇

字符串分割

fmt.Println(strings.Split(s5, ",")) // [你好 佩奇]

是否包含子字符串

fmt.Println(strings.Contains(s5, "好")) // true

检查前缀

fmt.Println(strings.HasPrefix(s5, "你好,")) // true

检查后缀

fmt.Println(strings.HasSuffix(s5, "奇")) // true

查找索引

fmt.Println(strings.Index(s5, "奇")) // 10, byte索引

查找最后一个的索引

fmt.Println(strings.LastIndex(s5, "奇")) // 10, byte索引

合并子字符串

fmt.Println(strings.Join(strings.Split(s5, ","), "!")) // 你好!佩奇

打印输出

前面用到了几种输出方法, 总结一下

fmt.Print(s5) // 打印不换行
fmt.Println(s5) // 打印并换行
fmt.Printf("%s\n", s5) // 你好,佩奇 格式化输出, %s 字符串
fmt.Printf("%q\n", s5) // "你好,佩奇" %q 加上引号
fmt.Printf("%T\n", s5) // string %T 类型