web-dev-qa-db-fra.com

Déclarer un tableau constant

J'ai essayé:

const ascii = "abcdefghijklmnopqrstuvwxyz"
const letter_goodness []float32  = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness  = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }
const letter_goodness = []float32 { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 }

Premièrement, la déclaration et l’initialisation fonctionnent bien, mais les deuxième, troisième et quatrième ne fonctionnent pas. Comment puis-je déclarer et initialiser le tableau const de floats?

129
demas

Un tableau n'est pas immuable par nature; vous ne pouvez pas le rendre constant.

Le plus proche que vous pouvez obtenir est:

var letter_goodness = [...]float32 {.0817, .0149, .0278, .0425, .1270, .0223, .0202, .0609, .0697, .0015, .0077, .0402, .0241, .0675, .0751, .0193, .0009, .0599, .0633, .0906, .0276, .0098, .0236, .0015, .0197, .0007 }

Notez le [...] au lieu de []: il vous assure d'obtenir un tableau (taille fixe) au lieu d'une tranche. Donc, les valeurs ne sont pas fixes mais la taille est.

186
Denys Séguret

De Effective Go :

Les constantes dans Go ne sont que cela - constantes. Ils sont créés au moment de la compilation, même lorsqu'ils sont définis comme des éléments locaux dans des fonctions, et ne peuvent être que des nombres, des chaînes ou des booléens. En raison de la restriction liée à la compilation, les expressions qui les définissent doivent être des expressions constantes, évaluables par le compilateur. Par exemple, 1 << 3 est une expression constante, alors que math.Sin (math.Pi/4) ne l'est pas, car l'appel de la fonction à math.Sin doit avoir lieu au moment de l'exécution.

Les tranches et les tableaux sont toujours évalués pendant l'exécution:

var TestSlice = []float32 {.03, .02}
var TestArray = [2]float32 {.03, .02}
var TestArray2 = [...]float32 {.03, .02}

[...] indique au compilateur de déterminer la longueur du tableau lui-même. Les tranches enveloppent les tableaux et sont plus faciles à manipuler dans la plupart des cas. Au lieu d'utiliser des constantes, rendez les variables inaccessibles à d'autres packages en utilisant une première lettre minuscule:

var ThisIsPublic = [2]float32 {.03, .02}
var thisIsPrivate = [2]float32 {.03, .02}

thisIsPrivate est disponible uniquement dans le package dans lequel il est défini. Si vous avez besoin d'un accès en lecture depuis l'extérieur, vous pouvez alors écrire une simple fonction de lecture (voir Getters in golang ).

50
fasmat

Il n’existe pas de constante de tableau dans Go.

Citant le Aller à la spécification de langue: Constantes :

Il y a des constantes booléennes , des constantes runiques , des constantes entières , constantes à virgule flottante , constantes complexes et constantes de chaîne . Les constantes runiques, entières, à virgule flottante et complexes sont collectivement appelées constantes numériques .

Un expression constante (utilisé pour initialiser une constante) ne peut contenir que des opérandes constante et est évalué à la compilation.

La spécification répertorie les différents types de constantes. Notez que vous pouvez créer et initialiser des constantes avec expressions constantes de types ayant l'un des types autorisés en tant que type sous-jacent . Par exemple, ceci est valide:

func main() {
    type Myint int
    const i1 Myint = 1
    const i2 = Myint(2)
    fmt.Printf("%T %v\n", i1, i1)
    fmt.Printf("%T %v\n", i2, i2)
}

Sortie (essayez-le sur le Go Playground ):

main.Myint 1
main.Myint 2

Si vous avez besoin d'un tableau, il ne peut s'agir que d'une variable, mais pas d'une constante.

Je recommande cet excellent article de blog sur les constantes: Constantes

9
icza

Comme d'autres l'ont mentionné, il n'y a pas de construction Go officielle pour cela. Le plus proche que je puisse imaginer serait une fonction qui retourne une tranche. De cette manière, vous pouvez garantir que personne ne manipulera les éléments de la tranche d'origine (car elle est "codée en dur" dans le tableau).

J'ai raccourci votre tranche pour la rendre ... plus courte ...:

func GetLetterGoodness() []float32 {
    return [...]float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}
2
Paul