byte 和 rune 类型
组成字符串的每个元素叫做字符,可以通过遍历或者单个获取字符串元素获得字符。字符用单引号包裹
a := 'A'
Go 语言中字符有两种类型
- uint8 类型,或者叫做 byte 类型,代表了 ASCII 码的一个字符
- rune 类型, 代表一个 UTF-8 字符
s1 := "a" //string
s2 := 'a' //int32
fmt.Printf("s1:%T, s2:%T\n", s1, s2)
s3 := "你" //string
s4 := '你' //int32
fmt.Printf("s3:%T, s4:%T\n", s3, s4)
s5 := byte('a') //int8
fmt.Printf("s5:%T\n", s5)
当需要处理 中文、日文 等复合字符时,则需要用到 rune 类型,该类型实际上是一个 int32
Go 使用了特殊的 rune 类型来处理 Unicode, 让基于 Unicode 的文本处理更为方便, 也可以使用 byte 型进行默认字符型处理,性能和扩展性都有照顾
str := "hello 杨帆"
for i := 0; i < len(str); i++ { //byte
fmt.Printf("%v(%c) ", str[i], str[i])
}
fmt.Println()
for _, s := range str { //rune
fmt.Printf("%v(%c) ", s, s)
}
字符串的修改
str := "hello A"
strRange := []rune(str) //把字符串强制转换为rune切片
strRange[6] = 'B'
fmt.Println(string(strRange))
[]rune(), []byte() 字符切片
类型转换
表达式 T()
n := 10
var f float64
f = float64(n)
fmt.Printf("%T\n", f)
练习题:统计字符串中汉字的数量
package main
import (
"fmt"
"unicode"
)
func CountHan(s string) int {
var count int
for _, c := range s {
if unicode.Is(unicode.Han, c) {
count++
}
}
return count
}
func main() {
fmt.Println(CountHan("hello 杨帆,test 测试"))
}
//输出 4