2017-06-02 3 views
3

私はGolangを勉強していますが、にのチュートリアルを見つけたツアーを行っていました。周りを遊ぶために少し変更しました(土曜日から日曜日など)。それは遠く離れてを印刷しました。日曜日の場合でもGolangツアースイッチの評価順:time.Now()。平日()+ 2ランタイムエラーが発生する:インデックスが範囲外です

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    day := time.Monday 

    fmt.Printf("When's %v?\n", day) 
    today := time.Now().Weekday() 

    switch day { 
    case today + 0: 
     fmt.Println("Today.") 
    case today + 1: 
     fmt.Println("Tomorrow.", today + 1) 
    case today + 2: 
     fmt.Println("In two days.", today + 2) 
    default: 
     fmt.Println("Too far away.", today + 2) 
    } 
} 

を、それは私に出力を提供します::だから、私はこのように見えるようにコードを修正

When's Monday? 
Too far away. %!v(PANIC=runtime error: index out of range) 

私は、代わりに配列を超えて、それを追加のインデックスをMODために何ができますか?何らかの演算子のオーバーロードが好きなように思えます。追加操作でMODを行うべきではないでしょうか、少なくとも日数の場合はデフォルトで、少なくとも?

答えて

4

これは実装の詳細です。

この行に

fmt.Println("In two days.", today + 2) 
today

2time.Weekdayに変換され、加算が行われる型なし整数定数であり、その基礎となるタイプとしてintを有するタイプtime.Weekdayです。

fmt.Println()の実装は、渡された値は、fmt.Stringerを実装するかどうかをチェックし、time.Weekdayはないので、そのString()方法は、そのインプリメンテーションと呼ばれるある:days 7個の素子のアレイである

// String returns the English name of the day ("Sunday", "Monday", ...). 
func (d Weekday) String() string { return days[d] } 

var days = [...]string{ 
    "Sunday", 
    "Monday", 
    "Tuesday", 
    "Wednesday", 
    "Thursday", 
    "Friday", 
    "Saturday", 
    } 

例えばtime.Saturday + 2が平日ではありませんので、Weekday.String()には範囲チェックはありません。 Weekday.String()timeパッケージで定義された定数のために正常に動作する保証:

type Weekday int 

const (
    Sunday Weekday = iota 
    Monday 
    Tuesday 
    Wednesday 
    Thursday 
    Friday 
    Saturday 
) 

あなたはそれを動作させるにしたい場合は、あなたが7で割った余りを使用する必要があり、このように:

switch day { 
case (today + 0) % 7: 
    fmt.Println("Today.") 
case (today + 1) % 7: 
    fmt.Println("Tomorrow.", (today+1)%7) 
case (today + 2) % 7: 
    fmt.Println("In two days.", (today+2)%7) 
default: 
    fmt.Println("Too far away.", (today+2)%7) 
} 
+0

参考までに、これは[モジュロ](https://en.wikipedia.org/wiki/Modulo_operation)と呼ばれています。 – Adrian

+0

そこのサンプルが私を守ってくれました。私は秒の間、 '(今日+ 1)%7 'が私に整数を与えるだろうと考えましたが、モジュラス演算子もオーバーロードされています...それは私の頭を回転させています。 * switch *に今集中しています。 –

+0

@czaは 'func(d Weekday)String()string {return days [d]}'がint型です –

関連する問題