我想使用net.Addr加入 []rune ": "的文本表示形式,从而得到一个新的[]rune。什么是最惯用的方法?

我目前有(出于示例目的,空格和显式键入):

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

最佳答案

如果您只是想让代码清晰易懂,请执行以下操作:

[]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。如果您的 rune slice 中包含无效的代码点或代理对(从Go 1.1开始),最终将出现错误 rune 替换它们。在大多数情况下,这不是问题,但值得考虑。

示例:http://play.golang.org/p/AFoBX_2Wem
invalid := utf8.MaxRune + 1
fmt.Println([]rune(string(invalid))[0] == utf8.RuneError) // prints true

关于unicode - 连接net.Addr和[] rune,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16860654/

10-10 04:32