私はGolangとNimを学んでいますclass
がstruct
、これらはありませんが、これらの種類の言語の初心者です。OOPに慣れているので、構造体を使用してクラスのようなものを作成しようとしましたが、構造体のフィールドはオプションであることがわかりました。厳格なコードを書くためにそれらを必須にしたいと思います。
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",
}
解決策の1つは、構造体を初期化する関数を実装することです。引数が完全に渡されない場合、失敗します。
ゴラン
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)
。コンストラクタではこれは不可能です。上記の利点とは別に、必要に応じて直接structをインスタンス化できるため、ファクトリ関数はデフォルト値を初期化するための繰り返しを回避するのに役立ちます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加