查漏补缺之Go的Strings, bytes, runes和字符

字节遍历,字符遍历

https://play.golang.org/p/DeZcCN9aHXo

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    s := "充气nb1"
    // 字节遍历
    for i := 0; i < len(s); i++ {
        fmt.Println(s[i])
    }
    // 字符遍历
    fmt.Println("len:", len(s))
    for i, k := range s {
        fmt.Println(i, k)
    }

    // 字节遍历2
    for i, w := 0, 0; i < len(s); i += w {
        runeValue, width := utf8.DecodeRuneInString(s[i:])
        fmt.Printf("%#U starts at byte position %d\n", runeValue, i)
        w = width
    }
}

总结

  1. golang的string是以UTF-8编码的,而UTF-8是一种1-4字节的可变长字符集,每个字符可用1-4字节 来表示

  2. 使用下标方式s[i]访问字符串s,s[i]是UTF-8编码后的一个字节(uint8),即按字节遍历

  3. 使用for i,v := range s 方式访问s,i是字符串下标编号,v是对应的字符值(int32=rune),即按字符遍历

  4. 使用fmt.Printf打印时,%c占位符打印的是字符,%+v占位符打印的是这个类型自身,如fmt.Printf("%+v",s[i])打印的就是字节一个十进制的无符号整数s[i]

  5. 如果希望以随机方式访问字符串s的每个字符,可以先转为[]rune数组,再以下标访问

参考资料

聊聊go语言的Strings、bytes、runes和字符

unicode/utf8官网

猜你喜欢

转载自www.cnblogs.com/yudidi/p/12177359.html
今日推荐