2015-10-17 14 views
8

Sto cercando di usare enum in golang come di seguito. Sto lottando per trovare un modo semplice per scorrere l'elenco dei valori costanti. Quali sono le pratiche comuni in Golang per scorrere su valori costanti usati come enum. Grazie!c'è un modo per iterare su costante usato come enum

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

In Java, è possibile eseguire l'iterazione come di seguito.

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

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

Prima di tutto, tutti gli identificatori di Go sono normalmente in [MixedCaps] (https://github.com/golang/go/wiki/CodeReviewComments#mixed-caps), incluse le costanti. Potresti fare un semplice ciclo come 'for d: = Monday; d <= domenica; d ++ {} 'dove conosci esplicitamente i valori di inizio/fine o potresti aggiungere alias per quelli (ad es. qualcosa come firstDay = Monday; lastDay = Sunday'). Sebbene sia possibile andare oltre per creare qualcosa che utilizzi l'IMO 'range', non ne vale assolutamente la pena. –

+0

A proposito, c'è già ['time.Weekday'] (https://golang.org/pkg/time/#Weekday) che va da 'time.Sunday' a' time.Saturday'. (Ovviamente ti è capitato di mettere giorni della settimana come un esempio arbitrario, questo non è importante). –

+0

Dave, grazie per la risposta. Ho corretto il caso per le costanti. Sto cercando enum in generale, non solo nei giorni feriali. firstDay e lastDay mi sembrano interessanti. Dovrebbe andare nelle liste const o sono variabili esterne? Grazie! –

risposta

7

Non v'è alcun modo diretto per enumerare i valori/istanze del tipo di chiamata in fase di esecuzione, se le variabili o costanti, a meno che non specificatamente definire una fetta che li elenca. Questo è lasciato al definitore o all'utente del tipo di enumerazione.

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

Per poter generare questo elenco dinamicamente in fase di esecuzione, ad es. tramite riflessione, il linker dovrebbe conservare tutti i simboli definiti in tutti i pacchetti, come fa Java. Il gruppo golang-nuts ha discusso questo, per quanto riguarda i nomi e le funzioni esportati da un pacchetto, un superset di definizioni di costanti di pacchetti. https://groups.google.com/forum/#!topic/golang-nuts/M0ORoEU115o

Sarebbe possibile che il linguaggio includa lo zucchero sintattico per generare questo elenco in fase di compilazione se e solo se è stato fatto riferimento dal programma. Quale dovrebbe essere l'ordine di iterazione, però? Se la settimana inizia lunedì, la lista che ho definito non è molto utile; dovrai definire la tua fetta per coprire i giorni dal lunedì alla domenica.

Problemi correlati