zoukankan      html  css  js  c++  java
  • 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 相关的函数。

  • 相关阅读:
    RabbitMQ source was instantiated with usesCorrelationId set to true but a message was received with correlation id set to null
    【Ubuntu】运行命令如何免输入YES和回车?
    运营的本质
    什么???前端页面统计停留时间你不会???那可得好好看看这个文章了
    使用el-switch实现开关(更改状态后展示状态)
    Linux编译安装时常见错误解决办法
    SignalR前后端通信
    声音类型识别库运行环境搭建
    uniapp使用axios(亲测可用)
    background + gradient 使用技巧
  • 原文地址:https://www.cnblogs.com/igoodful/p/11259354.html
Copyright © 2011-2022 走看看