Me gustaría crear una constante mapa como el siguiente:

const (
    running = map[string]string{
        "one": "ONE",
        "two": "TWO",
    }
)

sin embargo cada vez que yo obtengo el siguiente error:

const initializer map[string]string literal is not a constant

¿Por qué es este el caso, ¿por qué Golang no tratarlos como cualquier otra variable?

  • Creo que la respuesta a la pregunta porque es que los autores de ir juzgado que la complejidad de la aplicación es que no vale la pena los beneficios que trae.
  • Posibles duplicados de declarar una constante de matriz
  • Creo que es posible que desee una inmutable mapa. Usted no puede declarar una inmutable mapa sólo porque un mapa en el lenguaje es una construcción lingüística, pero no una aplicación de algunas de las Map de la interfaz. Es decir, no se puede implementar su propio mapa, que son compatibles (por las interfaces) con los internos, Ir mapa.
InformationsquelleAutor anonrose | 2016-06-23

2 Comentarios

  1. 19

    De https://golang.org/ref/spec#Constants:

    Un valor constante se representa por una runa, número entero, punto flotante,
    imaginario, o un literal de cadena, un identificador que denota una constante, un
    expresión de la constante, una conversión con un resultado que es una constante, o
    el valor del resultado de algunas funciones integradas tales como inseguro.Sizeof
    se aplica a cualquier valor, gorra o len aplicado a algunas expresiones, bienes y
    imag aplicado a un complejo constante y compleja aplicada a numérico
    constantes.

    tl;dr sólo tipos numéricos, cadenas y bools pueden ser constantes, las matrices, los cortes y los mapas no son de tipo numérico.

  2. 3

    Mi opinión sobre esto es que esta decisión fue puramente pragmático: Go es un muy abajo-a-Tierra del lenguaje (en oposición a otros — más «purista» — idiomas), y una propiedad interesante de la realidad del mundo mapa de las implementaciones es que el mero acceso a ellos para la lectura podría actualizar su representación interna (!). Decir, que puede recopilar y almacenar algunas estadísticas sobre su uso, o pueden reequilibrar un árbol subyacente que contiene el valor de cubos, etc. Permitiendo un «const mapa» para existir significaría la especificación explícita de una serie de complicadas restricciones en el lenguaje de especificación — la mayoría de los que posiblemente requiera implementaciones de tener dos mapas de las implementaciones.

    También puede tratar de verlo desde otro ángulo: considere la posibilidad de una constante de cadena. Tal cosa podría ser fácilmente integrado en el .rodata sección de el binario resultante y en realidad representada por la dirección de los datos en la memoria (bueno, cadenas en Ir más complicado, pero vamos a pasar por alto ese detalle). Es decir, una constante de cadena puede ser verdaderamente «estática»: es solo una serie de estática R/O bytes en la memoria — tan simple como eso.
    Por el contrario, un mapa es una complicada bestia alimentado por una intrincada maquinaria, y cada mapa es un tipo especial de objeto complejo una instancia en tiempo de ejecución. Es por eso que usted no puede incluso declarar un mapa y usarlo: debe make() de primera como de los canales, y por la misma razón.

    De nuevo, algunos hack, posiblemente, podría ser hecho para el apoyo constante de los mapas.
    Decir, una aplicación podría ordenar las llaves de tu mapa hasta el frente, serializar (con valores) en un contigous región de R/O datos y, a continuación, utilizar el binario de búsqueda en tiempo de ejecución para buscar los valores. Que sería totalmente ineficaz para mapas grandes /a algunos de los principales patrones, pero supuestamente el trabajo.
    Aún así, eso sería una especializadas mapa de la aplicación completamente diferente al «normal» uno. Creo que Ir a los desarrolladores decidieron que la desventaja es que no vale la pena beneficio posible.

    Dos notas de seguimiento:

    • Como usted puede ver, usted puede relativamente fácil de emular un readonly mapa:
      tienen una rebanada literal de algunos struct tipos de incrustación de ambas claves y valores,
      presorted sobre las teclas, y se envuelve en una función que realiza una binario
      la búsqueda de la clave.

    • Prefiero considerar la posibilidad de Ir de constantes de un poco como macros en un C-como
      idiomas: son un tipo y sentir como ser textual (no son
      pero estoy hablando de la sensación, después de todo) 😉

      Asegúrese de leer este para una visión general.

Dejar respuesta

Please enter your comment!
Please enter your name here