码迷,mamicode.com
首页 > 其他好文 > 详细

golang -- 字符串就地取反

时间:2019-03-22 11:49:06      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:The   有关   符号   其他   常用   一段   包括   +=   表示范围   

字符串

定义

在golang中字符串是一种不可变的字节序列,它可以包含任意的数据,包括0值字节,但主要是人类可以阅读的文本。golang中默认字符串被解读为utf-8编码的Unicode码点(文字符号)序列。

特性

golang中字符串具有不可变性。例如

str := "hello 世界!"

str[0] = 'L'

这种写法会引起编译错误:str[0] 不可赋值

字符串支持类似数组中分片的引用写法:


fmt.Println(str[:5]) // 输出 hello

fmt.Println(str[7:]) // 输出 世界

fmt.Println(str[len(s)+1:) // 宕机 

str[i:j] , 当i、j 越界 (j 、i < 0 或 j、i > len(str) )或 j < i 时会发生宕机。

str := "Hello"

t := str

str += "world"

这种写法可以通过,虽然str指向了一个新的字符串“Hello world”,但t指向的旧字符串仍然存在。
不可变意味着两个字符串能够安全的共享同一段底层内存,是的复制任何长度字符串的开销都低廉,类似的字符串s及其子串(s[n:])字符串的复制也开销低廉。

常见问题

  1. 顺序输出字符串中的每一个字符。

这个问题乍一看十分的简单,直接遍历就好了:


str := "Hello 世界!" 

for i := 0; i < len(str) ; i++{
    fmt.Printf(“%c \t”,str[i])
}

然而事实没那么简单,其输出结果如下:

H   e   l   l   o       ?   ?   -   ?   ?   ?   ?   ?   ?

中文字符部分全部为乱码。这与utf-8的编码规则有关, utf-8是以字节为单位对unicode码点进行变长编码。每一个文字符号用1~4个字节表示,ASCII字符仅仅占1字节的内存,其他常用的文书符号会占到2~3个字节。一个字符编码的首字节高位指明后面还有多少个字节:

规则 表示范围 说明
0xxxxxxx 文字符号0~127 Ascii 字符
110xxxxx 10xxxxxx 128~2047 少于128个未使用的值
1110xxxxx 10xxxxxx 10xxxxxx 2048~65535 少于2048个未使用的值
1110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 65536~0x10ffffff 其他未使用值

比如Ascii字符串,0x00~0x7f

Hello子串中的字符为Ascii字符,占用一个字节, 而 世界这两个符号占用的字符为 3 个,所以遍历的时候会出现乱码的情况。

golang -- 字符串就地取反

标签:The   有关   符号   其他   常用   一段   包括   +=   表示范围   

原文地址:https://www.cnblogs.com/cnblogs-wangzhipeng/p/10577212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!