Tôi luôn chuyển đổi chuỗi thành [] byte thành chuỗi lặp đi lặp lại. Có rất nhiều chi phí với điều này? Có cách nào tốt hơn?Go: Chi phí chuyển đổi từ [] byte thành chuỗi và ngược lại
Ví dụ, đây là một chức năng chấp nhận một chuỗi UTF8, bình thường hóa nó, loại bỏ dấu trọng âm, sau đó chuyển đổi ký tự đặc biệt để ASCII tương đương:
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()
}
Vì vậy, tôi bắt đầu với một chuỗi bởi vì đó là những gì tôi nhận được, sau đó tôi chuyển đổi nó thành một mảng byte, sau đó trở lại một chuỗi, sau đó đến một mảng byte một lần nữa, sau đó trở lại một chuỗi một lần nữa. Chắc chắn điều này là không cần thiết nhưng tôi không thể tìm ra cách để không làm điều này ..? Và nó thực sự có rất nhiều chi phí hay tôi không phải lo lắng về việc làm chậm mọi thứ với chuyển đổi quá mức?
(Ngoài ra nếu có ai có thời gian tôi chưa tìm ra cách bytes.Buffer
thực sự hoạt động, sẽ không tốt hơn nếu khởi tạo bộ đệm có kích thước 2x của chuỗi, là kích thước đầu ra tối đa của giá trị trả về ?)
Ưa thích. 'Width' có vẻ không cần thiết ... tôi có thể không chỉ làm cho nó' r, w: = utf8.DecodeRune' và sau đó bỏ đi với 'w = width'? – Alasdair
@Alasdair: Không. 'I, w: = 0, 0' khai báo' w' cho phạm vi bên ngoài. 'r, w: = utf8.DecodeRune' sẽ redeclare' w' cho phạm vi bên trong. 'i + = w' sử dụng' w' trong phạm vi bên ngoài, vì vậy bạn sẽ nhận được một lỗi "' w khai báo và không được sử dụng' "cho' w' trong phạm vi bên trong. [Đặc tả ngôn ngữ lập trình đi] (http://golang.org/ref/spec); [Blocks] (http://golang.org/ref/spec#Blocks); [Tuyên bố và phạm vi] (http://golang.org/ref/spec#Declarations_and_scope); [Khai báo biến ngắn] (http://golang.org/ref/spec#Short_variable_declarations). – peterSO
Được rồi. Cảm ơn vì đã giải thích. – Alasdair