在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1. 字符串底层就是一个byte数组,所以可以和[]byte类型互相转换;(字符串可以存文本,也可以存二进制,因为其本来就是一个字节流) 2. 字符串之中的字符是不能修改的,那怎么修改呢(待解决(练习题中练习1有解决(转换为字节数组进行修改)))? 示例如下: 我们可以发现已经飘红了,并有英文提示不能修改字符串中的字符。 说明Go语言中字符串是一个只读的类型,并不能直接修改。 3. 字符串是由byte字节组成,所以字符串的长度是byte字节的长度; 示例见示例1-1 4. rune类型用来表示utf8字符,一个rune字符由1个或多个byte组成;
补充: 1) 字符与字节关系? 答:如果是英文字符,1个字符对应1个byte(字节),如果是中文字符,1个字符对应2个,甚至是3个、4个byte; 2) UTF8编码? 答:utf8针对最大的好处是,其实可变的,如果是英文字符,其就给1个byte,如果是中文就根据其需要的给定指定的字符个数,这对于网络带宽的节省是很重要的。 3) rune类型其实就是int32类型;
实例1-1
package main import ( "fmt" ) func main() { var str string str = "abc汉子" var b []byte = []byte(str) //将str强制转换为字节数组([]byte) var chars []rune = []rune(str) //将str转换为rune数组([]rune) fmt.Printf("b =%v, len(str)=%d\n", b, len(str)) fmt.Printf("%c\n", 97) fmt.Printf("chars =%v, chars count:%d\n", chars, len(chars)) } 执行结果: 解释: 1) 输出的就是ASCII码(字符,不论是英文还是中文在底层存储的都是一个整数ASCII码),97对应的就是a; 2) 由实例看到一个"汉"字由三个字节组成,对应的ASCII码为230 177 137; 3) str字符串的长度为9,因为底层存储的是字节,可以看到输出9个字节,所以长度为9,而不是表面我们数的5个(字符是5个); 4) chars count:5 表示str字符的长度为5(我们需要将字符串(默认是ASCII编码)转换为rune类型进行计算) 5)chars =[97 98 99 27721 23376]:表示的是str字符串各个字符对应在底层的utf8编码
二、练习题练习1:写一个程序,对英文字符串进行逆序。 方法1:复杂写法 package main import ( "fmt" ) func main() { var str string = "abcdefg" bytes := []byte(str) //字符串中的字符不能直接修改,所以我们这里转成byte数组 //var i int //i = 0 //var i = 0 for i := 0; i < len(bytes)/2; i++ { //要除以2,因为一次循环做2次操作 //fmt.Printf("%c ", str[i]) //打印出来的是字符串中的字节数组 //通过将第一个和最后一个进行交换实现逆序 var tmp = bytes[i] //将前一个赋值为一个临时变量 bytes[i] = bytes[len(bytes)-i-1] //将前一个赋值为后一个 bytes[len(bytes)-i-1] = tmp //将后一个赋值为前一个 } str = string(bytes) //将byte数组转换为字符串 fmt.Printf("reverse string:%s\n", str) } 执行结果: 方法2:牛逼写法 package main import ( "fmt" ) func main() { var str string = "abcdefg" bytes := []byte(str) for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-i-1] = bytes[len(bytes)-i-1], bytes[i] //两个变量拿起来直接交换即可 } str = string(bytes) //将byte数组转换为字符串 fmt.Printf("reverse string:%s\n", str) }
练习2:写一个程序,对包含中文的字符串进行逆序。 package main import ( "fmt" ) func main() { var str = "张志凡" bytes := []rune(str) //中文字符必须转化成rune类型 for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-i-1] = bytes[len(bytes)-i-1], bytes[i] } str = string(bytes) fmt.Printf("reverse string:%v\n", str) } 执行结果如下:
练习3:写一个程序,判断一个字符串是否是回文。 回文:例如:98789, 这个数字正读是98789,倒读也是98789 package main import ( "fmt" ) func main() { var str = "98789" bytes := []rune(str) for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-i-1] = bytes[len(bytes)-i-1], bytes[i] } if str == string(bytes) { fmt.Print("为回文") } else { fmt.Print("不是回文") } } 执行结果: |
请发表评论