2016-03-13 21 views
2

我正在使用strings.Split來分割一個字符串。我應該如何將切片轉換爲golang中的字符串?

我想我的程序保留數組中的一個元素並釋放底層數組。

不幸的是,我不知道如何將一個字符串切片轉換爲一個字符串,而不是指向底層字符串。

我應該做這樣的事情:

func unslice(s string) (string) { 
    return string([]byte(s)) 
} 

的背景是:

  1. 基礎字符串是非常大的
  2. 我想保留片很小
  3. 我想保留的片段將保留很長時間
  4. 程序將運行很長一段時間 - 周或程序將拆分許多這些字符串(百萬)

的壽命期間更

  • 下面是響應於該評論的示例。

    func takesBigStringOften(big string) { 
        parts := strings.Split(big, " ") 
    
        saveTinyStringForALongTime(parts[0]) 
    } 
    
  • +0

    張貼的目標是否無法正常工作? –

    +0

    目標是什麼?舉個例子。 – XXXX

    +0

    @MuffinTop我不知道它是否做我想要的。我也不確定是否有這樣做的標準方式。我想這是一件很平常的事情,所以我很驚訝,我找不到任何東西,用google搜索。 – Coder

    回答

    2

    爲了確保Go不保持基礎字符串在內存中,你將不得不明確地將其複製到新的位置:

    func unslice(old string) string { 
        new := make([]byte,len(old)) 
        copy(new,old) 
        return string(old) 
    } 
    
    SmallString := unslice(BigString[0:7]) 
    
    +0

    謝謝,這是否意味着在我嘗試的解決方案中[] byte(s)'返回一個slice? – Coder

    +0

    @Coder是'[] byte(s)'返回一個字節片段,其中每個字節是字符串's'中的一個字符。 – evanmcdonnal

    +0

    @evanmcdonnal謝謝! – Coder

    2

    正如一些進一步的信息。一些基準測試代碼和內存分析顯示,從1.5.3開始,兩種方法都從堆中分配相同數量的內存,即以任一方式分配新副本。在從字節片構建字符串時,編譯器會調用一個例程來創建字節的唯一副本 - 因爲字符串是不可變的,而字節片不是。

    $ go tool pprof -alloc_space so002.test cprof0 
    Entering interactive mode (type "help" for commands) 
    (pprof) list copy 
    Total: 9.66MB 
        9.62MB  9.62MB (flat, cum) 99.55% of Total 
         .   .  15: 
         .   .  16:var global string 
         .   .  17: 
         .   .  18:func benchmarkcopy(b *testing.B, c int) { 
         .   .  19: big := "This is a long string" 
         .  240B  20: parts := strings.Split(big, " ") 
         .   .  21: old := parts[0] 
         .   .  22: jlimit := 100 
         .   .  23: for i := 0; i < b.N; i++ { 
         .   .  24:  for j := 0; j < jlimit; j++ { 
        3.21MB  3.21MB  25:   global = string([]byte(old)) 
         .   .  26:  } 
         .   .  27:  for j := 0; j < jlimit; j++ { 
         .   .  28:   b := []byte(old) 
        3.21MB  3.21MB  29:   global = string(b) 
         .   .  30:  } 
         .   .  31:  for j := 0; j < jlimit; j++ { 
        3.21MB  3.21MB  32:   new := make([]byte, len(old)) 
         .   .  33:   copy(new, old) 
         .   .  34:   global = string(old) 
         .   .  35:  } 
         .   .  36: } 
         .   .  37:} 
    
    +0

    不錯!這就說得通了。非常徹底的答案。我還沒有關於這方面的分析 – Coder

    +0

    這麼多令人欽佩的事情去吧。簡單的CPU和內存分析就是其中之一。我仍然試圖簡化自己的配置文件設置,以便輕鬆分析我關心的事情。我看到其他更擅長的人,似乎認爲這是理所當然的。仍然試圖達到自己的舒適程度,所以這裏的問題似乎是一個很好的實驗。 – WeakPointer

    相關問題