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

Go语言中有单个字符和ascii码值直接转换的方法吗?

// 附录1
golang的字符称为rune,等价于C中的char,可直接与整数转换。

    var c rune='a' 
    var i int =98
    i1:=int(c)
    fmt.Println("'a' convert to",i1)
    c1:=rune(i)
    fmt.Println("98 convert to",string(c1))
    //string to rune
    for _, char := range []rune("世界你好") {
        fmt.Println(string(char))
    }

字节遍历,字符遍历

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官网

其他

全面认识golang string

package main

import (
    "fmt"
)

func main() {
    s := "测试"
    fmt.Println(s)
    fmt.Println(len(s))
    fmt.Println(s[0])
    for _, v := range s {
        fmt.Println(v)
    }
}

参考

1.rune ascll

posted @ 2020-01-10 17:39  sicnu-yudidi  阅读(296)  评论(0编辑  收藏  举报