oop - 如何强制 struct 中的所有文件像 OOP 中的构造函数一样填充?
问题描述
摘要和代码
我正在学习没有class
但有的Golang 和 Nim struct
,并且是这类语言的新手。习惯了 OOP,我尝试使用 struct 制作类似类的东西,但发现 struct 的字段是可选的。我想强制它们以编写严格的代码。
JAVA
class Person {
String Name
int Age
Person(String Name, int Age) {
this.Name = Name;
this.Age = Age;
}
}
// Ok
Person p1 = new Person("John Doe", 30);
// FAILS
Person p2 = new Person("John Doe");
戈朗
type Person struct {
Name string
Age int
}
// Ok
p1 := Person{
Name: "John Doe",
Age: 30,
}
// Ok
p2 := Person{
Name: "John Doe",
}
解决方案之一是实现一个初始化结构的函数;如果参数未完全传递,则失败。
戈朗
func newPerson(Name string, Age int) Person {
return Person{
Name: Name,
Age: Age,
}
}
// Ok
p1 := newPerson("John Doe", 30)
// FAILS
p2 := newPerson("John Doe")
问题
我觉得上述解决方案是多余的,因为 init 函数必须与每个结构一起出现。这种方法流行还是有更好的解决方案?
解决方案
在 Golang 中,您可以使用类似构造函数的工厂函数(就像您在上面定义的那样)在初始化结构时初始化默认值。
是的,这是正确的解决方案,选择这样的解决方案有几个优点。我列出了其中的一些:
- 您将仅在必要时实现工厂功能,从而避免不必要的输入。
- 完全控制对象构造,即如果初始化不成功,您可以通过将函数签名设置为
func newPerson(Name string, Age int) (Person, error)
. 在构造函数中这是不可能的。 - 用其他语言实现构造函数与用 Golang 实现工厂函数没有什么不同。
除了上述优点之外,由于您可以在必要时直接实例化 struct,因此工厂函数有助于避免重复初始化默认值。
推荐阅读
- mongodb - MongoDB connection problem with Docker container
- python - Selenium Chromedriver : 'dict' object has no attribute 'click' for find_element() method when w3c is disabled
- c++ - 指向整数转换的不兼容指针从 'int *' 取消引用与 * 分配给 'int'
- vba - 如何使用多个按钮在 MS Access 表单中使用文本字符串填充文本框?
- .net-core - 没有 DbContext 连接字符串的 EF 迁移
- r - R中数据框中的str替换和正则表达式匹配
- javascript - 如何触发从父组件到模态子组件的事件
- c - 某些内容未写入文件
- upwork-api - UpWork API 未正确找到实体
- javascript - 使用 React “useState”,当对象中的值更新时,即使某些值没有更改,也会重新渲染附加到状态的所有内容