如何强制struct中的所有文件都像OOP中的构造函数一样填充? 摘要与代码

如何强制struct中的所有文件都像OOP中的构造函数一样填充? 摘要与代码,oop,go,struct,nim-lang,Oop,Go,Struct,Nim Lang,我正在学习Golang和Nim,它们没有类,但是有结构,而且对这类语言是新手。由于习惯了OOP,我尝试使用struct创建类似类的东西,但发现struct的字段是可选的。为了编写严格的代码,我想将它们变成强制性的 JAVA 班级人员{ 字符串名 智力年龄 Person(字符串名称,整数年龄){ this.Name=Name; 这个。年龄=年龄; } } //嗯 人员p1=新人员(“John Doe”,30); //失败 人员p2=新人员(“John Doe”); Golang type Per

我正在学习Golang和Nim,它们没有
,但是有
结构
,而且对这类语言是新手。由于习惯了OOP,我尝试使用struct创建类似类的东西,但发现struct的字段是可选的。为了编写严格的代码,我想将它们变成强制性的

JAVA

班级人员{
字符串名
智力年龄
Person(字符串名称,整数年龄){
this.Name=Name;
这个。年龄=年龄;
}
}
//嗯
人员p1=新人员(“John Doe”,30);
//失败
人员p2=新人员(“John Doe”);
Golang

type Person结构{
名称字符串
年龄智力
}
//嗯
p1:=人{
姓名:“约翰·多伊”,
年龄:30,,
}
//嗯
p2:=人{
姓名:“约翰·多伊”,
}
解决方案之一是实现一个初始化struct的函数;如果参数没有完全通过,它将失败

Golang

func newPerson(姓名字符串,年龄整数)Person{
返回人{
姓名:姓名,,
年龄:年龄,,
}
}
//嗯
p1:=新人(“约翰·多伊”,30岁)
//失败
p2:=新人(“约翰·多伊”)
问题:
我觉得上面的解决方案是多余的,因为init函数必须与每个结构一起提供。这种方法很流行还是有更好的解决方案?

在Golang中,可以使用类似构造函数的工厂函数(如上面定义的函数)在初始化结构时初始化默认值

是的,这是正确的解决方案,选择这种解决方案有几个优点。我列出了其中一些:

  • 您将仅在必要时实现factory函数,从而避免不必要的键入
  • 完全控制对象构造,即如果初始化失败,您可以通过将函数签名设置为
    func newPerson(Name string,Age int)(Person,error)
    轻松返回错误。在构造函数中,这是不可能的
  • 在其他语言中实现构造函数与在Golang中实现工厂函数没有什么不同

  • 除了上述优点之外,由于您可以在需要时直接实例化struct,工厂函数有助于避免初始化默认值的重复

    我想你应该把这个问题称为golang。这不应该是语言不可知论,因为我至少知道两种语言,
    struct
    s不是这样工作的。谢谢你的建议,我不知道。你说的是哪种语言?如果参数没有完全通过,它们会失败吗?C#和斯威夫特是我马上想到的。C#/Swift中的结构具有与类非常相似的构造函数/初始化器。有人想要实现一个需要填充所有字段的API并不常见,大多数情况下,默认值就足够了。像示例中那样的严格初始值设定项是相当正常的。我不知道java和Goland的细微差别,但是C++中有一个严格的初始化器,它不允许初始化结构/类,而不需要初始化你想要的东西。我不能给出这个难懂的证据,但是从我的实践中我可以说每次不得不显式初始化每个参数看起来都是一个乏味的API。尽管我确信有一些用例是有意义的(比如实际数据和数据选项)。