golang之字符串

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

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

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

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

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

字节和字符的区别?

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

1) 解释字符串:

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

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

2) 非解释字符串:

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

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

和 C/C++ 不一样,Go 中的字符串是根据长度限定,而非特殊字符 。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 进制数。

  1. var ch int = 'u0041'
  2. var ch2 int = 'u03B2'
  3. var ch3 int = 'U00101234'
  4. fmt.Printf("%d - %d - %d ", ch, ch2, ch3) // integer
  5. fmt.Printf("%c - %c - %c ", ch, ch2, ch3) // character
  6. fmt.Printf("%X - %X - %X ", ch, ch2, ch3) // UTF-8 bytes
  7. fmt.Printf("%U - %U - %U", ch, ch2, ch3) // UTF-8 code point

输出:

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

格式化说明符 %c 用于表示字符;当和字符配合使用时,%v 或 %d 会输出用于表示该字符的整数;%U 输出格式为 U+hhhh 的字符串。

包 unicode 包含了一些针对测试字符的非常有用的函数(其中 ch 代表字符):

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


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

原文地址:https://www.cnblogs.com/igoodful/p/11259354.html