string - parse - ¿Cómo agregar un carácter a una cadena en Golang?
librerias golang (1)
¿Cómo agregar un carácter a una cadena en Go?
Esto no funciona:
s := "hello";
c := ''x'';
fmt.Println(s + c);
operación no válida: s + c (tipos de cadena y runa no coincidentes)
Esto tampoco funciona:
s := "hello";
c := ''x'';
fmt.Println(s + rune(c));
operación no válida: s + rune (c) (cadena de tipos no coincidentes y runa)
En Go rune, el tipo no es un tipo de carácter, es solo otro nombre para int32.
Si vienes de Java o un lenguaje similar, esto te sorprenderá, ya que Java tiene un tipo char y puedes agregar char a una cadena.
String s = "hello";
char c = ''x'';
System.out.println(s + c);
En Go necesitas ser más explícito:
s := "hello";
c := ''x'';
fmt.Println(s + string(c));
Omg, ¿realmente necesitas convertir cada carácter a una constante de cadena? Sí, pero no se preocupe, esto se debe a un sistema de tipo y el compilador lo optimiza correctamente. Bajo el capó, tanto Java como Go añaden el carácter de la misma manera.
Si cree que la escritura adicional es una mierda, solo compare cuántas veces aparece la palabra clave de cadena en cada ejemplo anterior. :)
Información adicional: (detalles técnicos)
En Go, las cadenas no son secuencias de runas, son secuencias codificadas en utf-8 de runas. Cuando recorres una cadena, obtienes runas, pero no puedes simplemente añadir una runa a una cadena. Por ejemplo: el símbolo del euro ''€'' es un entero 0x20AC (esto se denomina punto de código) Pero cuando codifica el signo del euro en utf-8, obtiene 3 bytes: 0xE2 0x82 0xAC http://www.fileformat.info/info/unicode/char/20aC/index.htm
Así que agregar un char funciona realmente así:
s = append(s, encodeToUtf8(c)) // Go
s = append(s, encodeToUtf16(c)) // Java
Tenga en cuenta que las codificaciones se realizan en tiempo de compilación.
Utf-8 puede codificar un carácter con 1, 2, 3 o 4 bytes. Utf-16 puede codificar un carácter con 2 o con 4 bytes.
So Go generalmente agrega 1 byte (para ascii) o 2, 3, 4 bytes para chino, y Java generalmente agrega 2 bytes (para ascii) o 4 bytes para chino.
Dado que la mayoría de los caracteres que usamos (oeste) se pueden codificar con 2 bytes, Java da la falsa creencia de que las cadenas son secuencias de caracteres de 2byte, lo cual es cierto hasta que necesite codificar 必须