gpt4 book ai didi

Golang tour Switch 求值顺序 : time. Now().Weekday() + 2 yields runtime error: index out of range

转载 作者:IT王子 更新时间:2023-10-29 00:43:31 24 4
gpt4 key购买 nike

我正在学习 Golang,正在浏览我找到关于切换评估顺序的教程的导览。我对它做了一些修改(例如周六到周日),只是为了玩玩。它打印太远了。即使是星期天。因此,我将代码修改为如下所示:

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 吗?

最佳答案

这是一个实现细节。

在这一行

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

today 的类型是 time.Weekday它的底层类型是int2是一个无类型整型常量,会被转换成time.Weekday并进行加法运算出。

执行fmt.Println()将检查传递给它的值是否实现 fmt.Stringer ,并且因为 time.Weekday 确实如此,它的 String()方法将被调用,其实现是:

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

其中 days 是一个包含 7 个元素的数组:

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

Weekday.String() 中没有范围检查,因为 time.Saturday + 2 不是工作日。 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)
}

关于Golang tour Switch 求值顺序 : time. Now().Weekday() + 2 yields runtime error: index out of range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44324792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com