Ich immer scheinen Zeichenfolgen in [] Byte zu Zeichenfolge wieder und wieder zu konvertieren. Ist da viel Aufwand? Gibt es einen besseren Weg?Go: Overhead der Konvertierung von [] Byte in String und umgekehrt
Zum Beispiel, hier ist eine Funktion, die einen UTF8-String akzeptiert, normalisiert es, Akzente entfernen, wandelt dann Sonderzeichen ASCII-Äquivalent:
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()
}
mit einem String So beginne ich, weil das ist, was ich get, dann wandle ich es in ein Byte-Array um, dann zurück zu einem String, dann wieder zu einem Byte-Array und dann wieder zu einem String. Sicher ist das unnötig, aber ich kann nicht herausfinden, wie man das nicht macht ..? Und hat es wirklich viel Overhead oder muss ich mir keine Sorgen machen, dass die Dinge durch übermäßige Conversions verlangsamt werden?
(Auch wenn jemand die Zeit habe ich noch nicht herausgefunden, wie bytes.Buffer
tatsächlich funktioniert, wäre es nicht besser, einen Puffer von 2x die Größe der Zeichenfolge zu initialisieren, die die maximale Ausgabegröße des Rückgabewerts ist ?)
Fancy. Die 'Breite' scheint unnötig zu sein ... kann ich nicht einfach' r, w: = utf8.DecodeRune' machen und dann die 'w = width' weglassen? – Alasdair
@Alasdair: Nein. 'I, w: = 0, 0' erklärt' w' für den äußeren Bereich. 'r, w: = utf8.DecodeRune' würde' w' für den inneren Bereich redeclare. "i + = w" verwendet das "w" im äußeren Bereich, so dass Sie einen Fehler "' w deklariert und nicht verwendet "für das" w "im inneren Bereich erhalten. [Die Programmiersprache Go] (http://golang.org/ref/spec); [Blöcke] (http://golang.org/ref/spec#Blocks); [Deklarationen und Geltungsbereich] (http://golang.org/ref/spec#Declarations_and_scope); [Kurze Variablendeklarationen] (http://golang.org/ref/spec#Short_variable_declarations). – peterSO
In Ordnung dann. Danke für die Erklärung. – Alasdair