2012-10-30 21 views
75

ho provato:dichiarare una matrice costante

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 } 

Primo, dichiarazione e inizializzazione funziona bene, ma il secondo, terzo e quarto non funzionano. Come posso dichiarare e inizializzare il const array di float?

risposta

109

Un array non è immutabile per natura; non puoi renderlo costante.

Quello più vicino si può ottenere è:

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 } 
+71

Solo per chiarezza: il '[...] sintassi T' è lo zucchero per' [123] T'. Crea una matrice di dimensioni fisse, ma consente al compilatore di capire quanti elementi ci sono dentro. – jimt

+3

Suppongo che consentire gli array costanti richiederebbe aggiornamenti al sistema di tipi. Altrimenti se hai definito una funzione 'f (xs [5] int)' non sapresti se la matrice passata fosse costante o mutabile. –

+0

tks, ho problemi quando provo a stringhe.Join 'non può usare constants.FilesRequired (type [4] string) as type [] stringa nell'argomento to strings.Join' –

34

Da Effective Go:

Costanti a Go sono proprio questo costante. Vengono creati in fase di compilazione, anche se definiti come locali nelle funzioni e possono essere solo numeri, stringhe o booleani. A causa della restrizione in fase di compilazione, le espressioni che li definiscono devono essere espressioni costanti, valutabili dal compilatore. Ad esempio, 1 < < 3 è un'espressione costante, mentre math.Sin (math.Pi/4) non è perché la chiamata della funzione a math.Sin deve avvenire in fase di esecuzione.

Fette e array vengono sempre valutate in runtime:

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

[...] dice al compilatore di capire la lunghezza della matrice stessa. Le fette avvolgono gli array e sono più facili da utilizzare nella maggior parte dei casi. Invece di utilizzare costanti apporta le variabili inaccessibile per altri pacchetti utilizzando una minuscola prima lettera:

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

thisIsPrivate è disponibile solo nel pacchetto è definito. Se è necessario l'accesso in lettura dall'esterno, è possibile scrivere una semplice funzione getter (vedere Getters in golang).

+0

Il codice di esempio "use" non è valido Vai: http://play.golang.org/p/JUsLIsIwkW – zzzz

+0

Mi dispiace, hai ragione. La mia prima risposta era completamente sbagliata. Questa risposta modificata dovrebbe ora fornire più aiuto. – fasmat

9

Non esiste una costante di array in Go.

citando il Go Language Specification: Constants:

Ci sono costanti booleane, runica costanti, intero costanti, virgola mobile costanti, costanti complesse e costanti string. Le costanti Rune, integer, floating-point e complesse sono collettivamente chiamate costanti numeriche .

A Constant expression (che viene utilizzato per inizializzare una costante) può contenere solo constant operandi e vengono valutati in fase di compilazione.

La specifica elenca i diversi tipi di costanti. Si noti che è possibile creare e inizializzare le costanti con constant expressions di tipi che hanno uno dei tipi consentiti come underlying type.Per esempio, questo è valido:

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) 
} 

uscita (provate sul Go Playground):

main.Myint 1 
main.Myint 2 

Se avete bisogno di una matrice, non può che essere una variabile, ma non è una costante.

Consiglio questo articolo grande blog su costanti: Constants

+0

allora cosa succede se serve un container con dimensioni costanti? –

+0

@Atomic_alarm Puoi elaborare per favore? – icza

+0

Esiste se nel C-array analogico golang? –

1

Come altri hanno detto, non v'è alcuna Go ufficiale costruire per questo. Il più vicino che posso immaginare sarebbe una funzione che restituisce una fetta. In questo modo, puoi garantire che nessuno manipolerà gli elementi della slice originale (dato che è "hardcoded" nell'array).

ho accorciato la tua fetta per renderlo più breve ... ...:

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

questo suona come il modo migliore per andare, tuttavia il tipo restituito func non corrisponde. 'impossibile usare [6] stringa letterale (tipo [6] stringa) come tipo [] stringa nell'argomento di ritorno' quindi 'return [] float32 {...}' – theRemix

Problemi correlati