Go 带范围夹紧的typedef

Go 带范围夹紧的typedef,go,Go,在围棋中,我们可以说: type Month int 创建基于int的新类型 是否也可以说此类型允许的值范围为1-12,并保证不能分配值12?否,无论您是否将int定义为自定义类型,都不能对其进行限制。您可以得到的最接近的代码类似于下面使用iota构造的代码 type Month int const ( Jan Month = iota + 1 Feb Mar Apr May Jun Jul Aug Sep Oc

在围棋中,我们可以说:

type Month int
创建基于int的新类型


是否也可以说此类型允许的值范围为1-12,并保证不能分配值<1或>12?

否,无论您是否将int定义为自定义类型,都不能对其进行限制。您可以得到的最接近的代码类似于下面使用iota构造的代码

type Month int

const (
    Jan Month = iota + 1
    Feb
    Mar
    Apr
    May
    Jun
    Jul
    Aug
    Sep
    Oct
    Nov
    Dec
)

func main() {
    fmt.Println(Jan, Feb, Mar)
}
这将打印
1 2 3
。它有很多用途,你可以在这里查阅更多信息


这并不保证您不能将随机值分配给结果变量,但只要您在任何地方都使用定义的常量,您就可以了。

否,无论您是否将int定义为自定义类型,都不能对其进行限制。您可以得到的最接近的代码类似于下面使用iota构造的代码

type Month int

const (
    Jan Month = iota + 1
    Feb
    Mar
    Apr
    May
    Jun
    Jul
    Aug
    Sep
    Oct
    Nov
    Dec
)

func main() {
    fmt.Println(Jan, Feb, Mar)
}
这将打印
1 2 3
。它有很多用途,你可以在这里查阅更多信息


这并不能保证您不能将随机值分配给结果变量,但只要您在任何地方都使用定义的常量,就可以了。

您可以通过使用未报告的变量存储值来限制对单个包的访问。比如说,

package date

type Month struct {
    month int
}

通过使用未报告的变量存储值,可以限制对单个包的访问。比如说,

package date

type Month struct {
    month int
}

不是在编译器级别,不是。在需要的地方,你必须自己编写逻辑。在Go中,你在语言级别所能做的一切都在规范中描述:不是在编译器级别,不需要。无论需要什么逻辑,你都必须自己编写。规范中描述了你在Go语言级别所能做的一切:这个答案是错误的。问题是“是否也可以说此类型允许的值范围为1-12,并保证不能分配任何小于1或大于12的值?”您的回答不能保证这一点。任何
int
值都是有效的:真正的答案是“不,你不能这样做,但这是你能得到的最接近你想要的”这个答案是错误的。问题是“是否也可以说此类型允许的值范围为1-12,并保证不能分配任何小于1或大于12的值?”您的回答不能保证这一点。任何
int
值都是有效的:真正的答案是“不,你不能这样做,但这是你能得到的最接近你想要的”这将值限制为允许值和零。不可能阻止零值。这将值限制为允许值和零。不可能阻止零值。