我有一个结构体Direction
,value
类型为字符串。Direction
应为N
、S
、W
或E
。
type Direction struct {
value string
}
受到这个问题的答案的启发:Go是否有"如果x "构造类似于Python?我想以有效的方式创建方向的一个好方法是:
func NewDirection(direction string) Direction {
switch direction {
case "N","S","W","E": return Direction{direction}
}
panic("invalid direction")
}
但这对我来说还不够,因为我仍然可以创建无效的方向:
d := Direction{"X"}
我还发现了一篇关于在go中强制使用构造函数的有趣文章。阅读这篇文章,我可以看到使用另一个包是必要的。我可以要一个"受保护的"吗?结构,例如,main package?
您已经完成了约定应该做的几乎所有事情:
- 使字段不导出
- 提供一个构造函数
- 在应该使用构造函数的类型上加注释,并解释如何处理零值(如果重要的话)
现在包的用户不能修改字段,并且构造函数的存在清楚地表明应该调用它来创建有效的实例。这是标准库设置的约定。
当然,还有其他方法可以使更加困难为了使值无效,但这本质上只是浪费时间,并且为了与假想的对手进行无法获胜的军备竞赛而使代码过于复杂。
如果有人不理解语言,不阅读文档,那么他们总是会找到滥用它的方法。如果他们积极地试图破坏自己,你无法阻止他们,也没有理由阻止他们。
包是Go语言中代码组织的最小功能单元。没有办法在例如文件级别保护字段。即使是同一个包中的文件也可以有效地操作,就好像它们的所有代码都在同一个文件中一样。因此,与构造函数在同一包中的任何代码都将具有与构造函数相同的权限。