dictionary - make - know meaning
¿Por qué Golang no permite mapas const? (2)
Desde https://golang.org/ref/spec#Constants :
Un valor constante se representa mediante una runa, un entero, un punto flotante, un imaginario o un literal de cadena, un identificador que denota una constante, una expresión constante, una conversión con un resultado que es una constante, o el valor del resultado de algunos incorporados funciones como unsafe.Sizeof aplicadas a cualquier valor, mayúscula o len aplicadas a algunas expresiones, real e imag aplicadas a una constante compleja y complejas aplicadas a constantes numéricas.
tl; dr solo tipos numéricos, cadenas y bools pueden ser constantes, matrices, cortes y mapas no son un tipo numérico.
Me gustaría crear un mapa constante como el siguiente:
const (
running = map[string]string{
"one": "ONE",
"two": "TWO",
}
)
Sin embargo cada vez que lo hago me sale el siguiente error:
const initializer map[string]string literal is not a constant
¿Por qué este es el caso, por qué Golang no los trata como cualquier otra variable?
Mi opinión sobre esto es que esta decisión fue puramente pragmática: Go es un lenguaje muy práctico (a diferencia de otros lenguajes "más puristas"), y una propiedad interesante de algunas implementaciones de mapas del mundo real es que Acceder a ellos para leerlos podría actualizar su representación interna (!). Por ejemplo, podrían recopilar y almacenar alguna estadística sobre su uso, o podrían volver a equilibrar un árbol subyacente que contiene los grupos de valores, etc. Permitir que exista un "mapa const" significaría especificar explícitamente un conjunto de restricciones complicadas en la especificación de idioma - la mayoría de las implementaciones que posiblemente requieran tener dos implementaciones de mapas.
También puedes intentar verlo desde otro ángulo: considera una cadena constante. Tal cosa podría integrarse fácilmente en la sección .rodata
del binario resultante y estar realmente representada por la dirección de esos datos en la memoria (bueno, las cadenas en Go son más complicadas, pero ignoremos ese detalle). Es decir, una cadena constante puede ser verdaderamente "estática": es solo una serie de bytes R / O estáticos en la memoria, tan simple como eso. A la inversa, un mapa es una bestia muy complicada impulsada por una maquinaria compleja, y cada mapa es un objeto complejo especial instanciado en tiempo de ejecución. Es por eso que no puede simplemente declarar un mapa y usarlo: debe make()
primero, como los canales, y por la misma razón.
Nuevamente, se podría hacer algo de hack para soportar mapas constantes. Por ejemplo, una implementación podría ordenar las claves de su mapa por adelantado, serializarlo (con valores) en una región contigua de datos de R / O y luego usar la búsqueda binaria en tiempo de ejecución para buscar los valores. Eso sería muy ineficaz para mapas grandes / ciertos patrones clave, pero supuestamente funcionaría. Aún así, eso sería una implementación de mapa especializada completamente diferente de la "normal". Creo que los desarrolladores de Go decidieron que la compensación no es un beneficio que valga la pena.
Dos notas de seguimiento:
Como puede ver, puede emular con relativa facilidad un mapa de solo lectura: tener un segmento literal de algunos tipos de estructura incrustando claves y valores, preclasificado en las claves, y envolverlo en una función que realice una búsqueda binaria en la clave.
Prefiero considerar las constantes de Go un poco como macros en lenguajes tipo C: están desvinculados y tienen ganas de ser textuales (no lo son, pero estoy hablando de sentimientos después de todo) ;-)
Asegúrese de leer this para una gran visión general.