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编码的文本。其设计兼顾了效率和安全性,通过长度信息和不可变性避免了常见的字符串处理错误。

