The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
x8

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

  •  
  •   x8 · Jul 8, 2016 · 1669 views
    This topic created in 3676 days ago, the information mentioned may be changed or developed.

    如题。

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

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

    7 replies    2016-07-09 17:32:39 +08:00
    htfy96
        1
    htfy96  
       Jul 8, 2016 via Android   ❤️ 1
    struct String
    {
      byte* str;
      int32 len;
     };

    类似的还有 channel map 切片等,都是引用语义
    Unknwon
        2
    Unknwon  
       Jul 8, 2016
    超长的先转 []byte 再索引啊。。。
    x8
        3
    x8  
    OP
       Jul 9, 2016
    @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)
    }


    输出的指针不一样
    x8
        4
    x8  
    OP
       Jul 9, 2016
    超长字符串索引并不会引发性能问题,结贴
    zwh8800
        5
    zwh8800  
       Jul 9, 2016   ❤️ 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  
       Jul 9, 2016
    多虑了,根本不会有性能问题
    mengzhuo
        7
    mengzhuo  
       Jul 9, 2016 via iPhone
    高性能 golang 编程很少用 string 是因为这货拆分、拼接的时候会 copy 多份
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2712 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 06:25 · PVG 14:25 · LAX 23:25 · JFK 02:25
    ♥ Do have faith in what you're doing.