package main
import "fmt"
func main() {
//todo:因为string字符串在golang中本质是切片【且默认情况下底层是[]byte切片】,每一个字符(即数字)本质上又是由连续
//todo:的单个字节表示的,因此可以进行如下转换,但注意不能用 []int8 []int16,虽然单个
//todo:汉字字符可以用int16两个字节的空间来表示 如: sli := []int16{12,'我'}可以运行不报错
//todo:以上详细可见 04int0float0bool0string0UTF8ASCII中的解释
sli := []int32("大家好") //只能用[]int32或[]rune
fmt.Println("sli=", sli) //sli= [22823 23478 22909] //22823~‘大’字 23478~‘家’ 22909~‘好’
//案例1.1 //for len遍历字符串是按默认或转类型后1个或几个字节为一个单位进行遍历的
fmt.Println("案例1.1")
str := "hello,world"
fmt.Println("len(str)=", len(str)) //len(str)= 11 //对字符串默认以[]byte一个字节为计数单位进行计数
for i := 0; i < len(str); i++ {
fmt.Println(str[i]) //104 101 108 108 111 44 119 111 114 108 100
fmt.Printf("序号%v=%c\n", i, str[i]) //0=h 1=e 2=l 3=l 4=o 5=, 6=w 7=o 8=r 9=l 10=d
}
//案例1.2 //for range 遍历字符串,是按照字面呈现出来的字符进行遍历的,但下标可能因遇到非1一个字节可表示的字符而发生跳跃
fmt.Println("案例1.2")
str2 := "hi,everyone"
fmt.Println("len(str2)=", len(str2)) //len(str2)=11
for k, v := range str2 {
fmt.Println(v) //104 105 44 101 118 101 114 121 111 110 101
fmt.Printf("序号%v=%c\n", k, v) //序号0=h 序号1=i 序号2=, 序号3=e 序号4=v 序号5=e 序号6=r 序号7=y 序号8=o 序号9=n 序号10=e
}
//案例2.1 //for len遍历字符串是按默认或转类型后1个或几个字节为一个单位进行遍历的
//由于字符串中出现汉字,再用原来的方式就会出现乱码
fmt.Println("案例2.1")
str3 := "hi,你好世界"
fmt.Println("len(str3)=", len(str3)) //len(str)= 15 //对字符串默认以[]byte一个字节为一个计数单位,字符串里的一个汉字占3个字节
for i := 0; i < len(str3); i++ {
fmt.Println(str3[i]) //104 105 44 228 189 160 229 165 189 228 184 150 231 149 140
fmt.Printf("序号%v=%c\n", i, str3[i]) //序号0=h 序号1=i 序号2=, 序号3=ä 序号4=½ 序号5= 序号6=å
// 序号7=¥ 序号8=½ 序号9=ä 序号10=¸序号11=– 序号12=ç 序号13=• 序号14=Œ
}
//案例2.2 //for len遍历字符串是按默认或转类型后1个或几个字节为一个单位进行遍历的
fmt.Println("案例2.2")
str4 := "hi,你好世界"
str44 := []int32(str4)
fmt.Println("len(str44)=", len(str44)) //len(str44)= 7 //经过将string类型转为[]int32类型,此时就是以4个字节为一个计数单位
//转类型后再用for range 下标也不会再跳
for i := 0; i < len(str44); i++ {
fmt.Println(str44[i]) //104 105 44 20320 22909 19990 30028
fmt.Printf("序号%v=%c\n", i, str44[i]) //序号0=h 序号1=i 序号2=, 序号3=你 序号4=好 序号5=世 序号6=界
}
//todo:注意案例2.2和案例2.3种遍历产生的下标的不同
//案例2.3 //for range 遍历字符串,是按照字面呈现出来的字符进行遍历的,但下标可能因遇到非1一个字节可表示的字符而发生跳跃
fmt.Println("案例2.3")
str5 := "hi,你好世界"
for k, v := range str5 {
fmt.Println(v) //104 105 44 20320 22909 19990 30028 //此时v的类型是int32
fmt.Printf("序号为%v=%c\n", k, v) //序号为0=h 序号为1=i 序号为2=, 序号为3=你 序号为6=好 序号为9=世 序号为12=界
}
}
12.2 string.go
最新推荐文章于 2022-09-13 10:22:19 发布