ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 字符串 一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列,我们稍后会详细讨论这个问题。 内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目),索引操作s\[i\]返回第i个字节的字节值,i必须满足0 ≤ i< len(s)条件约束。 第i个字节并不一定是字符串的第i个字符,因为对于非ASCII字符的UTF8编码会要两个或多个字节。我们先简单说下字符的工作方式。 ## 字符串不可修改 字符串的值是不可变的:一个字符串包含的字节序列永远不会被改变,当然我们也可以给一个字符串变量分配一个新字符串值。 因为字符串是不可修改的,因此尝试修改字符串内部数据的操作也是被禁止的: ~~~ s[0] = 'L' // compile error: cannot assign to s[0] ~~~ ## unicode 在golang中一个中文是一个unicode码点,一个英文也是一个unicode码点, unicode长这样 : `U+6211`. 我们用[]rune("你好")打印出来的数字是经过utf-8编码过的. ![](https://img.kancloud.cn/c1/d5/c1d569a0a8aaec2b9d5c4ebd994fbc2d_1336x486.png) ## utf-8 UTF8是一个将Unicode码点编码为字节序列的变长编码。因为unicode是固定的32个位,也就是4个字节来表示,这样就很浪费. 所有当不足4个字节的时候,使用UTF-8来进行编码,就会节省空间. 在go语言中,已经使用了UTF-8进行编码过了. ## 获取字符串长度 ``` utf8.RuneCountInString(s) //使用此方法可以获取字符串的长度 ``` ## 字符串和Byte切片 标准库中有四个包对字符串处理尤为重要:bytes、strings、strconv和unicode包。strings包提供了许多如字符串的查询、替换、比较、截断、拆分和合并等功能。 这面这个解释给出了,为什么要使用byte类型来处理字符串,因为字符串是不可变的.那么每次修改字符串,都会创建一个新的字符串,必然有大量的消耗.而使用byte的切片就可以减少这方面的消耗了. **bytes包也提供了很多类似功能的函数,但是针对和字符串有着相同结构的\[\]byte类型。因为字符串是只读的,因此逐步构建字符串会导致很多分配和复制。在这种情况下,使用bytes.Buffer类型将会更有效**。