Golang字符串遍历

什么是字符串

在 Go 语言中,字符串实际上是类型为 byte 的只读切片。

一个字符包含了任意个 byte。它并不限定 Unicode,UTF-8或者任何其它预定义的编码。在内容上,它完全等价于一个类型为 byte 的切片。

字符串是 Golang 语言中最常用的基础数据类型之一,虽然字符串被看作是一个整体,但是实际上字符串是一片连续的内存空间,我们也可以理解成一个由字符组成的数组。

C 语言中的字符串就使用字符串就使用字符数组 char[] 表示,作为数组会占用一片连续的内存连续空间,这片内存空间存储了的字节共同组成了字符串,Go语言中的字符串其实是一个只读的数组。

UTF-8 和字符串

索引字符字符串返回的是 byte,而不是字符:一个字符就是一堆字节。这意味着当我们将字符存储在字符串中时,实际存储的是这个字符的字节。

  • Go源码总是UTF-8

  • 一个字符串包含任意个byte

  • 字符串常量如果缺少字节级转义,将始终保持UTF-8序列。

  • Unicode的代码点在Go语言中被称为rune

  • Go不保证字符串中的字符是规范化的。

go有两种方式对字符串进行遍历

go 语言中的字条串实际上是类型为 byte 的只读切片。或者说一个字符串是一堆字节。

  • utf-8 uint8 byte

  • Unicode int32 rune

package main

import (
    "fmt"
    "reflect"
)

func main() {
    str := "Hello,世界"
    //utf-8遍历
    for i := 0; i < len(str); i++ {
        ch := str[i]
        ctype:=reflect.TypeOf(ch)
        fmt.Printf("%s ",ctype)                   //uint8
    }
    fmt.Println("=============>Unicode遍历")
    //Unicode遍历
    for _, ch1 := range str {
        ctype:=reflect.TypeOf(ch1)
        fmt.Printf("%s ",ctype)                    //int32
    }
}
修改字符串中的字节(用 []byte):

func main() {

     s := "Hello 世界!"

     b := []byte(s)        // 转换为 []byte,自动复制数据

     b[5] = ','            // 修改 []byte

     fmt.Printf("%s\n", s) // s 不能被修改,内容保持不变

     fmt.Printf("%s\n", b) // 修改后的数据

}

修改字符串中的字符(用 []rune):

func main() {

     s := "Hello 世界!"

     r := []rune(s)         // 转换为 []rune,自动复制数据

     r[6] = '中'            // 修改 []rune

     r[7] = '国'            // 修改 []rune

     fmt.Println(s)         // s 不能被修改,内容保持不变

     fmt.Println(string(r)) // 转换为字符串,又一次复制数据

}

参考

Last updated

Was this helpful?