float64 - ¿Por qué rune in golang es un alias para int32 y no uint32?
golang type casting (3)
La rune
tipo en Go se defined como
un alias para
int32
y es equivalente aint32
en todos los sentidos. Se utiliza, por convención, para distinguir valores de caracteres de valores enteros.
Si la intención es usar este tipo para representar valores de caracteres, ¿por qué los autores del lenguaje Go no utilizaron uint32
lugar de int32
? ¿Cómo esperan que se maneje un valor de rune
en un programa, cuando es negativo? El otro tipo similar, byte
, es un alias para uint8
(y no int8
), que parece razonable.
" Golang, Go: ¿qué es la runa por cierto? ", Mencionó:
Con el reciente Unicode 6.3, hay más de 110,000 símbolos definidos. Esto requiere al menos una representación de 21 bits de cada punto de código, por lo que una runa es como int32 y tiene muchos bits.
Pero con respecto a los problemas de desbordamiento o valor negativo, tenga en cuenta que la implementación de algunas de las funciones de Unicode como unicode.IsGraphic incluye:
Nos convertimos a
uint32
para evitar la prueba extra para el negativo
Código:
const MaxLatin1 = ''/u00FF'' // maximum Latin-1 value.
// IsGraphic reports whether the rune is defined as a Graphic by Unicode.
// Such characters include letters, marks, numbers, punctuation, symbols, and
// spaces, from categories L, M, N, P, S, Zs.
func IsGraphic(r rune) bool {
// We convert to uint32 to avoid the extra test for negative,
// and in the index we convert to uint8 to avoid the range check.
if uint32(r) <= MaxLatin1 {
return properties[uint8(r)]&pg != 0
}
return In(r, GraphicRanges...)
}
Esto se debe a que se supone que una runa es constant (como se menciona en " Explicación del tipo de runa Go ", donde una runa podría estar en un int32
o uint32
o incluso float32
o ...: su valor constante permite que se almacene en cualquiera de esos tipos numéricos ).
Busqué en Google y encontré esto: https://groups.google.com/forum/#!topic/golang-nuts/d3_GPK8bwBg
Esto ha sido pedido varias veces. La runa ocupa 4 bytes y no solo uno porque se supone que almacena puntos de código Unicode y no solo caracteres ASCII. Al igual que los índices de matriz, el tipo de datos está firmado para que pueda detectar fácilmente desbordamientos u otros errores al hacer aritmética con esos tipos.
No se vuelve negativo. Actualmente hay 1.114.112 puntos de código en Unicode, que está lejos de los 2.147.483.647 ( 0x7fffffff
), incluso teniendo en cuenta todos los bloques reservados.