当前位置: 首页 > 知识库问答 >
问题:

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

訾淇
2023-03-14

我有一个struct<code>Direction</code>,它的<code>值</code>类型为string方向应为NSW

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中强制使用构造函数的有趣文章。阅读这篇文章,我可以看到有必要使用另一个包。例如,我可以在主包中有一个“受保护的”结构吗?

共有1个答案

徐鸿达
2023-03-14

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

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

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

当然,还有其他方法可以让值更难失效,但这本质上只是浪费时间,为了与假想对手进行无法获胜的军备竞赛而使代码过于复杂。

如果有人不理解这种语言,也不阅读文档,那么他们总是会找到误用它的方法。如果他们积极地试图破坏自己,你没有办法阻止他们,也没有理由阻止他们。

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

 类似资料:
  • 问题内容: 我是Java的新手,我试图找到一种方法来在C语言中存储诸如结构之类的信息。例如,说我想让一名程序雇用员工。它将从用户那里获得一个名字,姓氏和ID号并将其存储起来。然后,用户可以根据条件查看该信息(例如,如果数据库有多于1名员工)。有没有人建议这样做的最佳方法? 问题答案: C中的结构就像Java中的类一样,功能更强大,因为Java中的类可以包含方法,而C ++可以。您创建一个新类。例如

  • 问题内容: 在此结构定义中: 字符串 “ json:message” 的含义是什么,以及如何访问它(如果可访问)。先感谢您。 问题答案: 这些是结构标记。包使用此struct标记 将对象转换为JSON,并将 JSON字符串转换为对象 在将一个结构封送(编码)为JSON字符串时,它将查找此struct标记以分配 键名,如果不存在,则它可能会使用结构字段名本身 顺便说一句语法是错误的 这是供参考的示例

  • 我有一个用于父级的构造函数: 稍后,我使用关键字创建一个对象: 我正在尝试使用defineProperty添加属性 但是,当我试图访问时,它返回。同样,当我在控制台中打印整个对象时,该属性仍然保持。 我错在哪了?

  • Go语言可以通过自定义的方式形成新的类型,结构体就是这些类型中的一种复合类型,结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。 结构体成员也可以称为“字段”,这些字段有以下特性: 字段拥有自己的类型和值; 字段名必须唯一; 字段的类型也可以是结构体,甚至是字段所在结构体的类型。 使用关键字  type 可以将各种基本类型定义为自定义类型,基本类型包括整型、字符串、布尔等

  • 我想让我的子组件有一个ref,但是我不希望用户在创建组件时必须指定ref。所以说我有这样的东西: 我希望父组件能够访问子组件的状态。最简单的方法是为每个组件添加一个ref,但我希望这是在函数中完成的,以便从最终用户那里抽象出它,因为我希望这些组件被通用化。 有没有一种干净的方法可以让父组件访问子组件的状态,例如当创建子组件时,您有以下内容: 因此,在父类内部,我可以执行以下操作: 因此,我希望能够

  • 主要内容:多种方式创建和初始化结构体——模拟构造函数重载,带有父子关系的结构体的构造和初始化——模拟父级构造调用Go语言的类型或结构体没有构造函数的功能,但是我们可以使用结构体初始化的过程来模拟实现构造函数。 其他编程语言构造函数的一些常见功能及特性如下: 每个类可以添加构造函数,多个构造函数使用函数重载实现。 构造函数一般与类名同名,且没有返回值。 构造函数有一个静态构造函数,一般用这个特性来调用父类的构造函数。 对于 C++ 来说,还有默认构造函数、拷贝构造函数等。 多种方式创建和初始化结构