¿Qué es una runa?

Resuelto asked hace 10 años • 10 respuestas

¿ Qué es un runein Go?

He estado buscando en Google pero Golang solo dice en una línea: runees 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 switchtiene 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 runepara stringque pueda devolver la cadena intercambiada. Pero no entiendo exactamente cómo runefunciona byteaquí.

 avatar Oct 11 '13 12:10
Aceptado

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 32a 'A', se obtiene 'a'y viceversa.

topskip avatar Oct 11 '2013 05:10 topskip

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' .charchar*

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 stringes 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 []runeo viceversa.

El paquete Unicode http://golang.org/pkg/unicode/ puede dar una idea de la riqueza del desafío.

fabmilo avatar Oct 11 '2013 19:10 fabmilo