Golang中字符串究竟是什么?

Golang中字符串究竟是什么? 我不知道还能说什么,因为这就是我的问题

6 回复

更多关于Golang中字符串究竟是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有趣且有用

这是一个愚蠢的问题吗?…"type"是指我或其他人用键盘输入的字符吗?

谢谢。我正在阅读它

我还没有阅读整篇文章,但在编程中,“type"几乎总是指"数据类型”。例如,int是一种可以存储整数值的数据类型。这个YouTube视频对此解释得相当不错。

在Go语言中,字符串是一个不可变的字节序列,通常用于表示UTF-8编码的文本。字符串在内部表示为指向字节数组的指针和长度,这使得它高效且易于处理。字符串是不可变的,这意味着一旦创建,其内容无法更改,任何修改操作都会生成一个新的字符串。

字符串的内部结构

在Go的运行时中,字符串由以下结构表示(简化):

type stringStruct struct {
    str unsafe.Pointer // 指向底层字节数组的指针
    len int            // 字符串的字节长度
}

字符串的创建和基本操作

以下示例展示了字符串的声明、初始化和一些常见操作:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    // 字符串声明和初始化
    var s1 string = "Hello, 世界"
    s2 := "Golang"

    // 字符串长度(字节数)
    fmt.Println("Length of s1 in bytes:", len(s1)) // 输出: 13(因为"世界"在UTF-8中占6字节)
    
    // 字符串连接
    s3 := s1 + " " + s2
    fmt.Println("Concatenated string:", s3) // 输出: Hello, 世界 Golang

    // 字符串不可变性示例
    // s1[0] = 'h' // 这行会编译错误:无法赋值给s1[0]

    // 通过切片访问字节(注意:返回的是字节,不是字符)
    byteSlice := []byte(s1)
    fmt.Printf("First byte of s1: %d\n", byteSlice[0]) // 输出: 72('H'的ASCII码)

    // 使用unsafe查看字符串结构(仅用于演示,生产代码中不推荐)
    strStruct := (*struct {
        ptr unsafe.Pointer
        len int
    })(unsafe.Pointer(&s1))
    fmt.Printf("String pointer: %p, Length: %d\n", strStruct.ptr, strStruct.len)
}

字符串与字符(rune)的关系

由于Go字符串是UTF-8编码,处理Unicode字符时需要使用rune类型:

package main

import "fmt"

func main() {
    s := "Hello, 世界"
    
    // 遍历字符串的字节
    fmt.Print("Bytes: ")
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
    fmt.Println()

    // 遍历字符串的Unicode字符(rune)
    fmt.Print("Runes: ")
    for _, r := range s {
        fmt.Printf("%c ", r)
    }
    fmt.Println()

    // 获取字符数量(不是字节数量)
    fmt.Println("Rune count:", len([]rune(s))) // 输出: 9
}

字符串与[]byte的转换

字符串和字节切片可以相互转换,但需要注意这会涉及内存分配:

package main

import "fmt"

func main() {
    s := "Golang"
    
    // 字符串转字节切片
    bytes := []byte(s)
    bytes[0] = 'g' // 可以修改字节切片
    fmt.Println("Modified bytes:", string(bytes)) // 输出: golang

    // 字节切片转字符串
    newStr := string(bytes)
    fmt.Println("New string:", newStr) // 输出: golang
}

空字符串和零值

在Go中,字符串的零值是空字符串"",其长度为0:

package main

import "fmt"

func main() {
    var emptyString string
    fmt.Printf("Empty string: '%s', Length: %d\n", emptyString, len(emptyString))
    // 输出: Empty string: '', Length: 0
}

总结来说,Go中的字符串是一个不可变的字节序列,通常存储UTF-8编码的文本。其设计兼顾了效率和安全性,通过长度信息和不可变性避免了常见的字符串处理错误。

回到顶部