golang之字符串

网友投稿 1491 2022-11-11

golang之字符串

golang之字符串

字符串中的每一个元素叫做“字符”。在遍历或者单个获取字符串元素时可以获得字符。严格来说,这并不是 ​​Go语言​​的一个类型,字符只是整数的特殊用例。

(1)最后要注意,字符串值是不可变的。也就是说,我们一旦创建了一个此类型的值,就不可能再对它本身做任何修改。

(2)字符串有两种表示。若用原生表示法,需用两个反引号“`”把字符序列包裹起来;若用解释型表示法,则需用双引号“"”包裹字符序列。 二者的区别是,前者表示的值是所见即所得的(除了回车符)。在那对反引号之间的内容就是该字符串值本身。而后者所表示的值中的转义符会起作用并在程序编译期间被转义。所以,如此表示的字符串值的实际值可能会与我们看到的表象不相同。

字符串是 UTF-8 字符的一个序列(当字符为 ​​ASCII​​ 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。每个中文汉字占用三个字节

(3)一个字符串类型的值可以代表一个字符序列。这些字符必须是被Unicode编码规范支持的。虽然从表象上来说是字符序列,但是在底层,一个字符串值却是由若干个字节来表现和存储的。一个字符串(也可以说字符序列)会被Go语言用Unicode编码规范中的UTF-8编码格式编码为字节数组。        (4)注意,我们在一个字符串值或者一个字符串类型的变量之上应用Go语言的内置函数len将会得到代表它的那个字节数组的长度。这可能与我们看到的表象是不同的。

字节和字符的区别?

Go 支持以下 2 种形式的字面值:

1) 解释字符串:

该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:

\n:换行符\r:回车符\t:tab 键\u 或 \U:Unicode 字符\\:反斜杠自身

2) 非解释字符串:

该类字符串使用反引号“`”括起来,支持换行,例如:

`This is a raw string \n` 中的 `\n\` 会被原样输出。

和 C/C++ 不一样,Go 中的字符串是根据长度限定,而非特殊字符 \0。string 类型的零值为长度为零的字符串,即空字符串 ""。

字符串的字节个数:内置函数len

字符串的字符个数:utf8.RuneCountInString函数

ASCII 字符串长度使用 len() 函数。此时字符串占用的字节数和字符数相同。Unicode 字符串长度使用 utf8.RuneCountInString() 函数。

总结

ASCII 字符串遍历直接使用下标。Unicode 字符串遍历用 for range。

字符串的遍历:for 索引/for range

字符串的修改

Go语言的字符有以下两种:

一种是 uint8 类型,或者叫 byte 型,代表了​​ASCII​​ 码的一个字符。另一种是 rune 类型,代表一个 UTF-8 字符。当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型实际是一个 int32。

byte 类型是 uint8 的别名,对于只占用 1 个字节的传统 ASCII 编码的字符来说,完全没有问题。例如:var ch byte = 'A';字符使用单引号括起来。在 ASCII 码表中,A 的值是 65,而使用 16 进制表示则为 41,所以下面的写法是等效的:

var ch byte = 65 或 var ch byte = '\x41'      //(\x 总是紧跟着长度为 2 的 16 进制数)

另外一种可能的写法是 \ 后面紧跟着长度为 3 的八进制数,例如:\377。不过 Go 同样支持 Unicode(UTF-8),因此字符同样称为 Unicode 代码点或者 runes,并在内存中使用 int 来表示。在文档中,一般使用格式 U+hhhh 来表示,其中 h 表示一个 16 进制数。其实 rune 也是 Go 当中的一个类型,并且是 int32 的别名。在书写 Unicode 字符时,需要在 16 进制数之前加上前缀 \u 或者 \U。因为 Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示。如果需要使用到 4 字节,则会加上 \U 前缀;前缀 \u 则总是紧跟着长度为 4 的 16 进制数,前缀 \U 紧跟着长度为 8 的 16 进制数。

var ch int = '\u0041'var ch2 int = '\u03B2'var ch3 int = '\U00101234'fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // integerfmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // characterfmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytesfmt.Printf("%U - %U - %U", ch, ch2, ch3) // UTF-8 code point

输出:

65 - 946 - 1053236A - β - r41 - 3B2 - 101234U+0041 - U+03B2 - U+101234

格式化说明符 %c 用于表示字符;当和字符配合使用时,%v 或 %d 会输出用于表示该字符的整数;%U 输出格式为 U+hhhh 的字符串。包 unicode 包含了一些针对测试字符的非常有用的函数(其中 ch 代表字符):

判断是否为字母:unicode.IsLetter(ch)判断是否为数字:unicode.IsDigit(ch)判断是否为空白符号:unicode.IsSpace(ch)

这些函数返回一个布尔值。包 utf8 拥有更多与 rune 相关的函数。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据库冗余是否必要
下一篇:matplotlib绘图技巧详解(三)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~