Dies funktioniert:
fmt.Println("\u2612")
Da ein interpreted string literal im Quellcode angegeben wird, und die Compiler unquote (interpretieren) es. Es ist nicht das fmt
-Paket, das diese Nichtquotierung verarbeitet.
funktioniert das nicht:
fmt.Println("\\u" + strVal)
Weil wieder eine interpretierte Stringliteral verwendet wird, die \u
zu einem string
Wert gelöst werden und dann wird es mit dem Wert der lokalen Variablen strVal
verkettet werden, die ist 2612
, so wird der endgültige string
Wert \u2612
sein. Dies ist jedoch kein interpretiertes String-Literal, dies ist das "endgültige" Ergebnis. Dies wird nicht weiter bearbeitet.
Alternativ zu JimBs Antwort können Sie auch strconv.Unquote()
verwenden, die ähnlich wie der Compiler tut.
Sehen Sie folgendes Beispiel:
// The original that works:
s := "\u2612"
fmt.Println(s, []byte(s))
// Using strconv.Unquote():
strVal := "2612"
s2, err := strconv.Unquote(`"\u` + strVal + `"`)
fmt.Println(s2, []byte(s2), err)
fmt.Println(s == s2)
Output (versuchen Sie es auf dem Go Playground):
☒ [226 152 146]
☒ [226 152 146] <nil>
true
hier etwas zu beachten: Wir haben den \u2612
Text von strconv.Unquote()
unquote wollen, aber Unquote()
erfordert, dass Die Zeichenfolge, die nicht in Anführungszeichen gesetzt werden soll ("Unquote interpretiert s als ein einfaches, doppelt zitiertes oder backquoted Go-String-Literal ..."), deshalb veröffentlichen wir vor und nach habe es mit einem Anführungszeichen versehen.
Ich würde bemerken, dass 'strconv.ParseInt()' gibt einen Wert vom Typ 'uint64' zurück, egal welche Bitgröße angegeben wurde. In einem weniger Spielzeugbeispiel müsste man das Ergebnis wahrscheinlich in' rune' umwandeln . – kostix
@kostix: guter Punkt, das passiert implizit in der String-Konvertierung. – JimB