2012-10-30 16 views
75

próbowałem:stwierdzenie stałą tablicę

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 } 

pierwsze, deklaracji i inicjalizacji działa dobrze, ale drugi, trzeci i czwarty nie działają. Jak mogę zadeklarować i zainicjować tablicę stałych zmiennych?

Odpowiedz

109

Tablica nie jest niezmienna przez naturę; nie możesz tego uczynić stałym.

Najbliższy można uzyskać to:

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

Tylko dla Wyjaśnienie: '[...] Składnia T' jest cukier dla' [123] T'. Tworzy stałą tablicę o rozmiarze, ale pozwala kompilatorowi określić, ile elementów w niej znajduje się. – jimt

+3

Sądzę, że zezwolenie na stałe tablice wymagałoby aktualizacji systemu typu. W przeciwnym razie, jeśli zdefiniowałbyś funkcję 'f (xs [5] int)' nie wiedziałbyś, czy tablica przekazana była stała czy zmienna. –

+0

tks, Mam problemy podczas próby łańcuchów.Join 'nie może używać stałych.FilesRequired (typ [4] ciąg) jako ciąg znaków [] w argumencie do ciągów.Join' –

34

Od Effective Go:

Stałe Przejdź są właśnie tym stały. Są tworzone w czasie kompilacji, nawet jeśli są zdefiniowane jako locale w funkcjach, i mogą być tylko liczbami, łańcuchami znaków lub wartościami logicznymi. Z powodu ograniczenia czasu kompilacji wyrażenia, które je definiują, muszą być wyrażeniami stałymi, możliwymi do oceny przez kompilator. Na przykład: 1 < < 3 jest wyrażeniem stałym, podczas gdy matematyka.Sin (matematyka.pi/4) nie jest, ponieważ wywołanie funkcji do matematyki.Syn musi wystąpić w czasie wykonywania.

plastry i tablice są zawsze następuje podczas wykonywania:

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

[...] informuje kompilator, aby dowiedzieć się długość samej tablicy. Plasterki owijają tablice i są łatwiejsze w obsłudze w większości przypadków. Zamiast używać stałych prostu zrobić zmienne unaccessible do innych pakietów za pomocą małych liter pierwszej litery:

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

thisIsPrivate jest dostępny tylko w pakiecie jest zdefiniowany. Jeśli potrzebujesz dostępu do odczytu z zewnątrz, możesz napisać prostą funkcję pobierającą (zobacz Getters in golang).

+0

Kod przykładowy "Użyj" jest nieprawidłowy Idź: http://play.golang.org/p/JUsLIsIwkW – zzzz

+0

Przykro mi, masz rację. Moja pierwsza odpowiedź była całkowicie błędna. Ta zredagowana odpowiedź powinna teraz zapewnić więcej pomocy. – fasmat

9

Nie ma czegoś takiego jak tablica stała w Go.

Cytowanie z Go Language Specification: Constants:

Istnieje Stałe logiczne, runa stałych, całkowitą stałe, zmiennoprzecinkową stałe, złożone stałe i ciąg stałych. Zmienne runy, liczby całkowitej, zmiennoprzecinkowe i złożone są wspólnie nazywane stałe numeryczne.

Constant expression (które jest wykorzystywane do inicjowania stała) może zawierać jedynie constant operandy i oceniane są w czasie kompilacji.

W specyfikacji podano różne rodzaje stałych. Zauważ, że możesz tworzyć i inicjować stałe z constant expressions typów mających jeden z dozwolonych typów jako underlying type.Na przykład ten jest ważny:

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

Output (spróbuj go na Go Playground):

main.Myint 1 
main.Myint 2 

Jeśli potrzebujesz tablicę, to może być tylko zmienna, ale nie stała.

Polecam tę wielką blogu artykuł o stałych: Constants

+0

co wtedy, gdy potrzebujesz pojemnika o stałym rozmiarze? –

+0

@Atomic_alarm Czy możesz opracować proszę? – icza

+0

Występuje w analogowej tablicy C-golang? –

1

Jak wspominają inni, nie ma oficjalnego Go skonstruować za to. Najbliższe, jakie mogę sobie wyobrazić, to funkcja, która zwraca kawałek. W ten sposób możesz zagwarantować, że nikt nie będzie manipulował elementami oryginalnego plasterka (ponieważ jest "zakodowany" w tablicy).

mam skrócić swój kawałek, aby go ... krótsza ...:

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

to brzmi jak najlepsza droga, jednak typ powrotu funkcji nie pasuje. 'nie może użyć [6] ciągu literowego (ciąg [6]) jako łańcucha znaków [] w zwracanym argumencie' , więc' return [] float32 {...} – theRemix

Powiązane problemy