¿Qué es una runa?
¿ Qué es un rune
in Go?
He estado buscando en Google pero Golang solo dice en una línea: rune
es un alias paraint32
.
Pero, ¿por qué los números enteros se utilizan en todas partes como casos de intercambio?
El siguiente es un caso de intercambio de funciones. ¿Qué es todo el <=
y -
?
¿Y por qué no switch
tiene argumentos?
&&
debería significar y pero ¿qué es r <= 'z'
?
func SwapRune(r rune) rune {
switch {
case 'a' <= r && r <= 'z':
return r - 'a' + 'A'
case 'A' <= r && r <= 'Z':
return r - 'A' + 'a'
default:
return r
}
}
La mayoría de ellos son de http://play.golang.org/p/H6wjLZj6lW
func SwapCase(str string) string {
return strings.Map(SwapRune, str)
}
Entiendo que esto se está asignando rune
para string
que pueda devolver la cadena intercambiada. Pero no entiendo exactamente cómo rune
funciona byte
aquí.
Los literales de runas son solo valores enteros de 32 bits ( sin embargo, son constantes sin tipo, por lo que su tipo puede cambiar ). Representan puntos de código Unicode. Por ejemplo, el literal de la runa 'a'
es en realidad el número 97
.
Por lo tanto su programa es prácticamente equivalente a:
package main
import "fmt"
func SwapRune(r rune) rune {
switch {
case 97 <= r && r <= 122:
return r - 32
case 65 <= r && r <= 90:
return r + 32
default:
return r
}
}
func main() {
fmt.Println(SwapRune('a'))
}
Debería ser obvio, si observaras el mapeo Unicode, que es idéntico a ASCII en ese rango. Además, 32 es de hecho el desplazamiento entre el punto de código en mayúsculas y minúsculas del carácter. Entonces, al agregar 32
a 'A'
, se obtiene 'a'
y viceversa.
De las notas de la versión de Go lang: http://golang.org/doc/go1#rune
La runa es un tipo. Ocupa 32 bits y está destinado a representar un CodePoint Unicode . Como analogía, el conjunto de caracteres ingleses codificados en 'ASCII' tiene 128 puntos de código. Por tanto, es capaz de caber dentro de un byte (8 bits). A partir de esta suposición (errónea), C trató los caracteres como 'bytes' y las 'cadenas' como una 'secuencia de caracteres' .char
char*
Pero adivina que. Hay muchos otros símbolos inventados por humanos además de los símbolos 'abcde...'. Y hay tantos que necesitamos 32 bits para codificarlos.
En golang entonces a string
es una secuencia de bytes
. Sin embargo, dado que varios bytes pueden representar un punto de código de runa, un valor de cadena también puede contener runas. Por lo tanto, se puede convertir a []rune
o viceversa.
El paquete Unicode http://golang.org/pkg/unicode/ puede dar una idea de la riqueza del desafío.