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



我有一个结构体Direction,value类型为字符串。Direction应为NSWE

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语言中代码组织的最小功能单元。没有办法在例如文件级别保护字段。即使是同一个包中的文件也可以有效地操作,就好像它们的所有代码都在同一个文件中一样。因此,与构造函数在同一包中的任何代码都将具有与构造函数相同的权限。

最新更新