go字符串
摘要
go字符串结构体包含:指向底层存储数组的指针、字符串长度。字符串按utf-8将字符编码成二进制数,然后存储在byte数组中。因为utf-8编码一个字符可能占用多个字节,例如一个汉字占3个字节,所以字符串中的一个字符可能对应byte数组中的多个元素。为了让一个字符对应数组的一个元素以便于处理,go设计了rune类型,其底层是int32,四个字节,正好能存储最大四个字节utf-8编码数据。
1、byte和rune类型
- byte等价于uint8类型的数据,一个字节大小,是字符串底层存储数据的结构。
- rune等价于int32类型的数据,四个字节大小,为了处理utf-8字符串而设计的。因为go语言字符串默认是按照utf-8编码的方式存储数据的,其中最大的字符占用4个字节的数据,所以需要rune才能一个字符对应一个数据元素。
2、字符串(string)
在go中字符串具有如下特征:
- go字符串存储在只读内存段中,不能被修改,但可以被切片和复制。
- 字符串结构由一个指向底层数组的指针和字符串长度组成。因为给出了具体长度,所以不需要以’\0’的方式判断字符串结尾。
- 底层使用字节(byte)数组存储字符串中各字符对应的数字编码。一个字符可能占用好几个byte。
需要注意的是在utf-8编码中,一个汉字占用3个字节,而byte是uint8类型,一个byte元素一个字节,需要三个byte才能存储一个汉字。所以:
func main() {
s := "哈喽世界"
fmt.Println(len(s)) // 输出:12
}
而rune是int32类型,四个字节,和utf-8最大字节数(4个字节)一致,所以可以将string类型转换为rune,去查看其具体存储的字符数。如下:
func main() {
s := "哈喽世界"
fmt.Println(len([]rune(s))) // 输出:4
}
需要注意的是:go中rune类型就是为了处理utf-8字符串而设计的,而定长4字节的方式存储utf-8中只占1、2、3个字节的字符,存在一定的空间浪费。所以string默认是按照byte类型的存储的,更加节省空间,当需要的时候,再转换为rune处理。
3、练习-反转字符串
如果反转函数如下:
func reverse(s string) string {
bs := []byte(s)
sLen := len(bs)
for i := 0; i < sLen/2; i {
bs[i], bs[sLen-i-1] = bs[sLen-i-1], bs[i]
}
return string(bs)
}
那么传入属于1字节编码的ASCILL字符,能够被反转:
func main() {
s := "abcdefg"
fmt.Println(reverse(s)) // 输出gfedcba
}
但是若传入需要占用多个字节的字符,就会输出乱码:
s := "哈喽世界"
fmt.Println(reverse(s)) // 输出��疸佖刓�
所以如果想要使得所有输入字符都能被正确的反转,应该使用rune代替byte:
func reverse(s string) string {
bs := []rune(s)
sLen := len(bs)
for i := 0; i < sLen/2; i {
bs[i], bs[sLen-i-1] = bs[sLen-i-1], bs[i]
}
return string(bs)
}
func main() {
s := "哈喽世界"
fmt.Println(reverse(s)) // 输出:界世喽哈
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbhibk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13