乐趣区

关于golang:12Go-字符串

本文视频地址

内置的 string 类型。无论是字符串常量、字符串变量还是呈现的字符串字面值,都被对立设置为 string。

const (s =“Hello")

func main() {var s1 string =“Golang"fmt.Printf("%T\n", s) // string
        fmt.Printf("%T\n", s1) // string
        fmt.Printf("%T\n",“Cool Golang") // string
}

Go string 类型具备如下性能特点:

string 类型的数据是不可变的
一旦申明了一个 string 类型的标识符,无论是变量还是常量,那么该标识符所指代的数据在整个程序的生命周期内便无奈被更改。

func main() {    
    var s = "hello Golang"
    fmt.Println("原始值:", s)

    sl := []byte(s)
    sl[0] = 't'
    fmt.Println("切片:", string(sl))
    fmt.Println("批改后的字符串:", s)
}

原始值: hello Golang
切片: tello Golang
批改后的字符串: hello Golang

在例子中咱们做了如下操作:
1 创立一个字符串
2 通过将 string 转换为一个 slice 并通过该 slice 对其内容进行批改。对 string 进行 slice 转换后,Go 编译器会为 slice 变量重新分配底层存储而不是共用 string 的底层存储,因而对 slice 的批改并未对原 string 的数据产生任何影响。

零值可用

var x string
fmt.Println(x) // x = ""
fmt.Println(len(x)) // 0

Go string 类型数据是不可变的,因而一旦有了初值后,那块数据就不会扭转,其长度也不会扭转。Go 将这个长度作为一个字段存储在了运行时的 string 类型构造中了。这样获取 string 长度的操作,即 len(s) 实际上就是读取存储在运行时中的那个长度值,这是一个代价极低的 O(1)操作。

反对通过 +/+= 操作符进行字符串连贯
s :=“Hello, "s = s +“World,"
s += "Cool"

fmt.Println(s) // Hello,World, Cool

反对各种比拟关系操作符:==、!=、>=、<=、> 和 <
1 如果两个字符串的 length 不雷同,那么无需比拟具体字符串数据,判定两个字符串是不同的。
2 如果 length 雷同,则要进一步判断数据指针是否指向同一块底层存储数据。

    如果雷同,则两个字符串是等价的。如果不同,则还需进一步去比对理论的数据内容。

对非 ASCII 字符提供原生反对
Go 源文件的字符编码默认为 UTF-8 编码。以 UTF-8 编码作为内码存储将对应的文本存储在内存当中的。

 s := "面向加薪学习"
    rs := []rune(s)
    bs := []byte(s)
    for i, v := range rs {var utf8Bytes []byte
        for j := i * 3; j < (i+1)*3; j++ {utf8Bytes = append(utf8Bytes, bs[j])
        }
        fmt.Printf("%s => %X => %X\n", string(v), v, utf8Bytes)
    }

面 => 9762 => E99DA2
向 => 5411 => E59091
加 => 52A0 => E58AA0
薪 => 85AA => E896AA
学 => 5B66 => E5ADA6
习 => 4E60 => E4B9A0

字符串变量 s 中存储的文本是”面向加薪学习“汉字字符(非 ASCII 字符领域),输入每个中文字符对应的 Unicode 码点,一个 rune 对应一个码点。UTF-8 编码是 Unicode 码点的一种字符编码模式,也是最罕用的一种编码格局,也是 Go 默认的字符编码格局。咱们还能够应用其余字符编码格局来映射 Unicode 码点,比方:UTF-16 等。
在 UTF-8 中,大多数中文字符都应用三个字节示意。[]byte(s)的转型让咱们取得了 s 底层存储的底层数组,从而咱们失去了每个汉字字符对应的 UTF-8 编码字节。
Go 语言间接提供了通过反引号 (`) 结构“所见即所得”的多行字符串的办法。

字符串的外部示意

Go string 在运行时示意为上面构造:

// $GOROOT/src/runtime/string.go
type stringStruct struct {
        str unsafe.Pointer
        len int
}

下面构造体,曾经通知咱们,运行时的 string 它自身并不真正存储数据,而仅是由一个指向底层存储的指针和字符串的长度字段组成。

字符串的高效结构

Go 还提供了其余一些结构字符串的办法, 如下:
应用 strings.Builder
应用 bytes.Buffer
应用 strings.Join
应用 fmt.Sprintf

退出移动版