【发布时间】:2014-09-14 06:14:22
【问题描述】:
我似乎总是一遍又一遍地将字符串转换为 []byte 到字符串。这有很多开销吗?有没有更好的办法?
例如,这里有一个函数,它接受一个 UTF8 字符串,对其进行规范化,去除重音符号,然后将特殊字符转换为 ASCII 等效字符:
var transliterations = map[rune]string{'Æ':"AE",'Ð':"D",'Ł':"L",'Ø':"OE",'Þ':"Th",'ß':"ss",'æ':"ae",'ð':"d",'ł':"l",'ø':"oe",'þ':"th",'Œ':"OE",'œ':"oe"}
func RemoveAccents(s string) string {
b := make([]byte, len(s))
t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
_, _, e := t.Transform(b, []byte(s), true)
if e != nil { panic(e) }
r := string(b)
var f bytes.Buffer
for _, c := range r {
temp := rune(c)
if val, ok := transliterations[temp]; ok {
f.WriteString(val)
} else {
f.WriteRune(temp)
}
}
return f.String()
}
所以我从一个字符串开始,因为这就是我得到的,然后我将它转换为一个字节数组,然后再转换回一个字符串,然后再转换为一个字节数组,然后再转换回一个字符串。当然这是不必要的,但我不知道如何不这样做..?它是否真的有很多开销,或者我不必担心过度转换会减慢速度?
(另外,如果有人有时间我还没有弄清楚bytes.Buffer实际上是如何工作的,那么初始化一个2倍于字符串大小的缓冲区会不会更好,这是返回的最大输出大小价值?)
【问题讨论】: