2015-10-17 19 views
8

私は以下のようにgolangでenumを使用しようとしています。私は一定の値のリストを反復する簡単な方法を見つけるのに苦労しています。列挙型として使用される定数値を反復するgolangの一般的な方法は何ですか?ありがとう!enumとして使用される定数を繰り返し処理する方法があります

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

Javaでは、以下のように繰り返すことができます。

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

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

まず、すべての移動識別子が定数を含む、[MixedCaps方式(https://github.com/golang/go/wiki/CodeReviewComments#mixed-caps)で正常です。あなたは 'for d:= Mondayのような単純なループを行うこともできます。 d日曜日;あなたは明示的に開始/終了値を知っているか、あるいはそれらの別名を追加することができます(例えば 'firstDay = Monday; lastDay = Sunday'のようなもの)。 「レンジ」IMOを使用するものを作ることは、さらに進んでも可能ですが、それは絶対に価値がありません。 –

+0

ところで、「time.Seeay」から「time.Saturday」に至る「time.Weekday」(https://golang.org/pkg/time/#Weekday)がすでにあります。 (もちろん、これは重要ではない任意の例として、曜日を入れただけです)。 –

+0

Dave、ありがとうございます。私は定数の場合を修正しました。私は、平日だけでなく一般的にenumsを探しています。 firstDayとlastDayは私にとって興味深いようです。 constリストに入るべきか、それとも変数の外にあるのでしょうか?ありがとう! –

答えて

7

あなたがそれらを特異的に一覧表示スライスを定義しない限り、変数や定数かどうか、実行時に名前付きの型の値/インスタンスを列挙するための直接的な方法はありません。これは、定義者または列挙型のユーザーに任せられます。

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

このリストを実行時に動的に生成できるようにするには、次のようにします。リフレクションを介して、リンカは、Javaのように、すべてのパッケージに定義されているすべてのシンボルを保持する必要があります。 golang-nutsグループは、パッケージからエクスポートされた名前と関数、パッケージ定数定義のスーパーセットについて、これについて説明しました。 https://groups.google.com/forum/#!topic/golang-nuts/M0ORoEU115o

言語がプログラムによって参照されている場合にのみ、コンパイル時にこのリストを生成するための構文糖を含めることは可能です。しかし、反復順序はどうすればよいでしょうか?あなたの週が月曜日に始まったら、私が定義したリストはそれほど役に立ちません。あなたは、月曜日から日曜日の日までの範囲にあなた自身のスライスを定義する必要があります。

関連する問題