rune相当于是Go的char。
package main
import "fmt"
func main() {
s := "Yes我爱慕课网!"
fmt.Println(len(s)) // 19 len(string) -> 字节数
fmt.Printf("%s\n", []byte(s)) // Yes我爱慕课网!
fmt.Printf("%X\n", []byte(s)) // 596573E68891E788B1E68595E8AFBEE7BD9121
// 对字节进行遍历,共19个字节
for _, b := range []byte(s) {
fmt.Printf("%X ", b) // 59 65 73 E6 88 91 E7 88 B1 E6 85 95 E8 AF BE E7 BD 91 21
// UTF-8编码,Yes和!各占一个字节,每个中文字符占3个字节
}
for i, ch := range s { // ch is a rune(4字节整数)
fmt.Printf("(%d %X) ", i, ch) // (0 59) (1 65) (2 73) (3 6211) (6 7231) (9 6155) (12 8BFE) (15 7F51) ...
// UTF-8编码转换成了Unicode编码,Yes和!各占一个字节,每个中文字符占3个字节
}
fmt.Println(utf8.RuneCountInString(s)) // 9 获得字符数量
bytes := []byte(s)
for len(bytes) > 0 {
ch, size := utf8.DecodeRune(bytes)
bytes = bytes[size:]
fmt.Printf("%c ", ch) // Y e s 我 爱 慕 课 网 !
}
// 如果不想了解字符的底层表示,直接用以下方法遍历字符串即可
for i, ch := range []rune(s) {
fmt.Printf("(%d %c) ", i, ch) // (0 Y) (1 e) (2 s) (3 我) (4 爱) (5 慕) (6 课) (7 网) (8 !)
}
}
字符串的操作可以到strings包下去寻找相应函数。
寻找最长不含有重复字符的子串:
func lengthOfNonRepeatingSubStr(s string) int {
lastOccurred := make(map[rune]int)
start := 0
maxLength := 0
for i, ch := range []rune(s) {
if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
start = lastI + 1
}
if i-start+1 > maxLength {
maxLength = i - start + 1
}
lastOccurred[ch] = i
}
return maxLength
}