1 回答
TA贡献1801条经验 获得超8个赞
Go 中的字符串类似于切片,它们只是一个包含指向底层数据的指针和长度的细描述符。
您可以在reflect.StringHeader类型中看到这一点:
type StringHeader struct {
Data uintptr
Len int
}
将字符串传递给函数时,会复制标头,但不会复制底层数据。我们可以更改您的示例以打印 的值Data,表明它指向内存中的相同地址:操场链接:
func main() {
str := "helloworld"
fmt.Println("string pointer 1: ", &str)
fmt.Println("string Data 1: ", (*reflect.StringHeader)(unsafe.Pointer(&str)).Data)
printStringPointer(str)
}
func printStringPointer(s string) {
fmt.Println("string pointer 2: ", &s)
fmt.Println("string Data 2: ", (*reflect.StringHeader)(unsafe.Pointer(&s)).Data)
}
输出:
string pointer 1: 0xc000010200
string Data 1: 4970654
string pointer 2: 0xc000010210
string Data 2: 4970654
传递字符串是常量时间(复制头部),底层数据不被复制。
- 1 回答
- 0 关注
- 85 浏览
添加回答
举报