Golang Go语言中官方字符串包为何使用string类型而非*string传入参数?
如题。
如果参数中的 string 非常大的话,复制 string 不是会增加性能开销么?
如果需要比较或者索引超长字符串,有没有什么好用的包,或者说干脆就自己写?
Golang Go语言中官方字符串包为何使用string类型而非*string传入参数?
struct String
{
byte* str;
int32 len;
};
类似的还有 channel map 切片等,都是引用语义
更多关于Golang Go语言中官方字符串包为何使用string类型而非*string传入参数?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
超长的先转 []byte 再索引啊。。。
是这样的,但是感觉结构体是会被复制的, byte* str 的值被复制,两个 byte* str 指向同一个 byte 序列
package main
import (
“fmt”
)
func main(){
s := “asdf”
f(s)
fmt.Printf("%p\n", &s)
}
func f(s string){
fmt.Printf("%p\n", &s)
}
输出的指针不一样
超长字符串索引并不会引发性能问题,结贴
string 在底层已经是指针了,具体可以看源码 /usr/local/go/src/runtime/string.go#L215
type stringStruct struct {
str unsafe.Pointer
len int
}
在线也可以看源码:
https://golang.org/src/runtime/string.go#L215
多虑了,根本不会有性能问题
高性能 golang 编程很少用 string 是因为这货拆分、拼接的时候会 copy 多份
在Golang(Go语言)中,官方字符串包(如strings
包)普遍使用string
类型而非*string
类型作为函数参数,这一设计选择主要基于以下几个方面的考虑:
-
不可变性:Go语言中的字符串是不可变的,这意味着一旦字符串被创建,其内容就不能被改变。因此,传递字符串时无需担心函数内部会修改其值,使用值传递(即直接传递
string
类型)是安全且高效的。 -
性能优化:字符串在Go中是一个结构体,包含指向底层数据的指针和长度信息。由于字符串的不可变性,传递字符串时实际上只传递了这些轻量级的元数据,而不是整个字符串数据。相比之下,使用
*string
可能会引入额外的指针解引用开销,且不一定带来性能上的优势。 -
API简洁性:使用
string
类型作为参数使得API更加直观和易于理解。开发者无需关心字符串是否是通过指针传递的,从而降低了学习成本和使用复杂度。 -
内存安全:由于字符串的不可变性和值传递的特性,Go语言的字符串处理在内存上是安全的,避免了潜在的指针操作错误和内存泄漏问题。
综上所述,Go语言官方字符串包选择使用string
类型而非*string
类型作为函数参数,是基于语言的不可变性设计、性能考虑、API简洁性以及内存安全性等多方面的权衡结果。这种设计使得Go语言的字符串处理既高效又安全。