在 go 语言中,我可以在结构中定义字符串的允许值和/或仅通过构造函数强制创建吗?

我有一个Direction字符串value类型的结构。Direction应该是N、S或。WE


type Direction struct {

    value string

}

受到这个问题的回答的启发:Does Go have "if x in" construct similar to Python? 我想以有效方式创建 Direction 的一种好方法可以是这个:


func NewDirection(direction string) Direction {

    switch direction {

        case "N","S","W","E": return Direction{direction}

    }

    panic("invalid direction")

}

但这对我来说还不够,因为我仍然可以创建无效的方向:


d := Direction{"X"}

我还发现了这篇关于在 go 中强制使用构造函数的有趣文章。阅读这篇文章,我可以看出使用另一个包是必要的。我可以在 main 包中有一个“受保护”的结构吗?


回首忆惘然
浏览 69回答 1
1回答

神不在的星期二

按照惯例,您几乎已经完成了所有应该做的事情:使字段未导出提供构造函数对应该使用构造函数的类型发表评论,并解释如何处理零值(如果这很重要)现在包的用户不能修改该字段,并且 constrictor 的存在清楚地表明应该调用它来创建有效实例。这是标准库设定的约定。当然,还有其他方法可以使值无效变得更加困难,但这本质上只是在浪费时间,并且为了与想象中的对手进行无法取胜的军备竞赛而使代码过于复杂。如果有人不懂该语言并且不阅读文档,那么他们总是会找到一种滥用它的方法。如果他们积极地试图破坏自己,那么您无法阻止他们,也没有理由阻止他们。包是 Go 中代码组织的最小功能单元。例如,无法在文件级别保护字段。即使是同一个包中的文件也能有效地运行,就好像它们的所有代码都在同一个文件中一样。因此,与构造函数在同一个包中的任何代码都将具有与构造函数相同的特权。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go