2015-10-17 21 views
8

Próbuję użyć enum w golang jak poniżej. Staram się znaleźć łatwy sposób na powtórzenie listy stałych wartości. Jakie są powszechne praktyki w golang do iteracji w stosunku do wartości stałych używanych jako enum. Dzięki!czy istnieje sposób na iterację stałej używanej jako enum

type DayOfWeek int 
const(
     Monday DayOfWeek = iota 
     Tuesday 
     Wednesday 
     Thursday 
     Friday 
     Saturday 
     Sunday 
    ) 

W Javie możemy iterować jak poniżej.

public enum DayOfWeek { 
    MONDAY, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY, 
    SATURDAY, 
    SUNDAY 
} 

for (DayOfWeek day: DayOfWeek.values()) { 
    // code logic 
} 
+5

Po pierwsze, wszystkie identyfikatory Go są zwykle w [MixedCaps] (https://github.com/golang/go/wiki/CodeReviewComments#mixed-caps), w tym stałe. Możesz wykonać prostą pętlę, taką jak 'for d: = Monday; d <= niedziela; d ++ {} 'gdzie wyraźnie znasz wartości początkowe/końcowe lub możesz dodać dla nich aliasy (np. coś takiego jak' firstDay = Monday; lastDay = Sunday'). Chociaż można pójść dalej, aby zrobić coś, co używałoby 'zasięgu' IMO, to absolutnie nie jest tego warte. –

+0

Nawiasem mówiąc, istnieje już ['time.Weekday'] (https://golang.org/pkg/time/#Weekday), który przechodzi od' time.Sunday' do 'time.Saturday'. (Oczywiście, że przypadkiem ustawiłeś dni tygodnia jako arbitralny przykład, to nieważne). –

+0

Dave, dziękuję za odpowiedź. Poprawiłem przypadek dla stałych. Patrzę na ogólne wyrazy nie tylko w dzień powszedni. firstDay i lastDay wydają mi się interesujące. Czy powinno to być na listach stałych, czy też są one zmiennymi zewnętrznymi? Dzięki! –

Odpowiedz

7

Nie ma bezpośredni sposób wyliczyć wartości/instancji o nazwie typu w czasie wykonywania, czy zmienne lub stałe, chyba że wyraźnie określić kawałek że ich list. Jest to zależne od definiującego lub użytkownika typu wyliczeniowego.

package main 

import (
    "fmt" 
    "time" 
) 

var Weekdays = []time.Weekday{ 
    time.Sunday, 
    time.Monday, 
    time.Tuesday, 
    time.Wednesday, 
    time.Thursday, 
    time.Friday, 
    time.Saturday, 
} 

func main() { 
    for _, day := range Weekdays { 
      fmt.Println(day) 
    } 
} 

Aby móc generować tę listę dynamicznie w środowisku wykonawczym, np. poprzez odbicie linker musiałby zachować wszystkie symbole zdefiniowane we wszystkich pakietach, tak jak robi to Java. Grupa golang-nuts omawiała tę kwestię, odnosząc się do nazw i funkcji wyeksportowanych z paczki, nadzbioru definicji stałych pakietów. https://groups.google.com/forum/#!topic/golang-nuts/M0ORoEU115o

Język może zawierać cukier syntaktyczny do generowania tej listy w czasie kompilacji wtedy i tylko wtedy, gdy odwołuje się do programu. Jaka powinna być kolejność iteracji? Jeśli Twój tydzień zaczyna się w poniedziałek, lista, którą zdefiniowałem, nie jest zbyt pomocna; będziesz musiał zdefiniować swój własny plasterek, aby przedzierał się przez dni od poniedziałku do niedzieli.

Powiązane problemy