登录
首页 >  Golang >  Go问答

在Go语言中,如何在定义结构体时限制字符串的取值范围或仅通过构造函数创建?

来源:stackoverflow

时间:2024-02-18 22:15:25 118浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《在Go语言中,如何在定义结构体时限制字符串的取值范围或仅通过构造函数创建?》,聊聊,我们一起来看看吧!

问题内容

我有一个 struct direction ,其 value 类型为字符串。 direction 应为 nswe

type direction struct {
    value string
}

受到这个问题的回答的启发:go 是否有类似于 python 的“if x in”结构?我想以有效的方式创建方向的一个好方法可能是这样的:

func newdirection(direction string) direction {
    switch direction {
        case "n","s","w","e": return direction{direction}
    }
    panic("invalid direction")
}

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

d := Direction{"X"}

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


正确答案


您已经完成了几乎所有按照惯例应该做的事情:

  • 使该字段不导出
  • 提供构造函数
  • 对类型添加注释,说明应使用构造函数,并解释如何处理零值(如果重要的话)

现在,包的用户无法修改该字段,并且收缩器的存在清楚地表明应该调用它来创建有效的实例。这是标准库设置的约定。

当然,还有其他方法可以使值无效更加困难,但这本质上只是浪费时间并使代码过于复杂,以便与一个无法获胜的军备竞赛。假想的对手。

如果有人不懂该语言并且不阅读文档,那么他们总是会找到滥用它的方法。如果他们积极地试图自我破坏,你就无法阻止他们,也没有理由阻止他们。

包是 Go 中代码组织的最小功能单元。无法在文件级别等领域保护字段。即使同一包中的文件也可以有效地运行,就好像它们的所有代码都在同一个文件中一样。因此,与构造函数位于同一包中的任何代码都将具有与构造函数相同的权限。

以上就是《在Go语言中,如何在定义结构体时限制字符串的取值范围或仅通过构造函数创建?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>