V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lizon
V2EX  ›  Go 编程语言

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

  •  
  •   lizon · 2016-07-08 22:15:22 +08:00 · 1143 次点击
    这是一个创建于 3090 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题。

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

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

    7 条回复    2016-07-09 17:32:39 +08:00
    htfy96
        1
    htfy96  
       2016-07-08 22:19:18 +08:00 via Android   ❤️ 1
    struct String
    {
      byte* str;
      int32 len;
     };

    类似的还有 channel map 切片等,都是引用语义
    Unknwon
        2
    Unknwon  
       2016-07-08 22:24:56 +08:00
    超长的先转 []byte 再索引啊。。。
    lizon
        3
    lizon  
    OP
       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
        4
    lizon  
    OP
       2016-07-09 00:10:36 +08:00
    超长字符串索引并不会引发性能问题,结贴
    zwh8800
        5
    zwh8800  
       2016-07-09 12:03:52 +08:00   ❤️ 1
    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
        6
    reus  
       2016-07-09 17:19:40 +08:00
    多虑了,根本不会有性能问题
    mengzhuo
        7
    mengzhuo  
       2016-07-09 17:32:39 +08:00 via iPhone
    高性能 golang 编程很少用 string 是因为这货拆分、拼接的时候会 copy 多份
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:33 · PVG 23:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.