golang 的官方字符串包里为什么都用 string 类型传入参数而不是*string?

2016-07-08 22:15:22 +08:00
 lizon

如题。

如果参数中的 string 非常大的话,复制 string 不是会增加性能开销么?

如果需要比较或者索引超长字符串,有没有什么好用的包,或者说干脆就自己写?

1049 次点击
所在节点    Go 编程语言
7 条回复
htfy96
2016-07-08 22:19:18 +08:00
struct String
{
  byte* str;
  int32 len;
 };

类似的还有 channel map 切片等,都是引用语义
Unknwon
2016-07-08 22:24:56 +08:00
超长的先转 []byte 再索引啊。。。
lizon
2016-07-09 00:09:23 +08:00
@htfy96 是这样的,但是感觉结构体是会被复制的, 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)
}


输出的指针不一样
lizon
2016-07-09 00:10:36 +08:00
超长字符串索引并不会引发性能问题,结贴
zwh8800
2016-07-09 12:03:52 +08:00
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
reus
2016-07-09 17:19:40 +08:00
多虑了,根本不会有性能问题
mengzhuo
2016-07-09 17:32:39 +08:00
高性能 golang 编程很少用 string 是因为这货拆分、拼接的时候会 copy 多份

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/291257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX