首页 > 解决方案 > 如何强制 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 函数必须与每个结构一起出现。这种方法流行还是有更好的解决方案?

标签: oopgostructnim-lang

解决方案


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

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

  1. 您将仅在必要时实现工厂功能,从而避免不必要的输入。
  2. 完全控制对象构造,即如果初始化不成功,您可以通过将函数签名设置为func newPerson(Name string, Age int) (Person, error). 在构造函数中这是不可能的。
  3. 用其他语言实现构造函数与用 Golang 实现工厂函数没有什么不同。

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


推荐阅读