byte 和 rune 类型

组成字符串的每个元素叫做字符,可以通过遍历或者单个获取字符串元素获得字符。字符用单引号包裹

a := 'A'

Go 语言中字符有两种类型

  1. uint8 类型,或者叫做 byte 类型,代表了 ASCII 码的一个字符
  2. 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