12.2 string.go

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=界
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值