连接net.Addr和[]符文

时间:2013-05-31 15:19:20

标签: unicode go

我希望使用[]rune加入net.Addr": "的文字表示,从而产生新的[]rune。最常用的方法是什么?

我目前有(用于示例的空白和显式输入):

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

首先要清晰简洁,如果出现问题,请稍后进行优化。