2013-05-31 30 views
1

我想加入net.Addr[]rune的文本表示形式,並使用": ",生成新的[]rune。什麼是最習慣的方式來做到這一點?Concatenate net.Addr和[] rune

我現在有(例如目的空白和顯式類型):

var (
    netAddr net.Addr 
    someRunes []rune 
    _   []rune = append(
        append(
         []rune(netAddr.String()), 
         []rune(": ")...), 
        someRunes... 
      ) 
) 
+4

這很有趣,原因你姓木。 – thwd

+2

@Tom:我從來沒有想過:D。我現在應該叫Matt Concatenator。 –

+1

@Matt Joiner:有了你的頭像,它是Matt的Contra Cat或者Matt ConCat! – peterSO

回答

2
[]rune(netAddr.String()+": ") 

要清楚,consise第一,後優化,如果有一個問題。

+0

你錯過了'someRunes'。 –

3

如果你只是想你的代碼清晰易懂,做這樣的事情:

[]rune(netAddr.String() + ": " + string(someRunes)) 

這是低效的,因爲那裏有一些不必要的副本,但它傳達的方式一個人可以在邏輯輕鬆閱讀。如果您的分析器稍後告訴您這是一個瓶頸,那麼您的多個附加解決方案仍然可能會執行比必要的更多副本/分配。我會做這樣的事情:

sep := []rune(": ") 
addr := []rune(netAddr.String()) 
newRuneSlice = make([]rune, 0, len(addr) + len(sep) + len(someRunes)) 
newRuneSlice = append(newRuneSlice, addr...) 
newRuneSlice = append(newRuneSlice, sep...) 
newRuneSlice = append(newRuneSlice, someRunes...) 

我的猜測是,你的分析器不會告訴你這是一個瓶頸,因此一個內膽是最有可能的最好的。但是,您應該意識到,一行代碼僅適用於有效的unicode。如果你的符文片中有無效的代碼點或代理對(來自Go 1.1),那麼最終會以錯誤符號代替它們。對於大多數情況,這不是一個問題,但值得思考。

例子:http://play.golang.org/p/AFoBX_2Wem

invalid := utf8.MaxRune + 1 
fmt.Println([]rune(string(invalid))[0] == utf8.RuneError) // prints true