構造体のすべてのフィールドをOOPのコンストラクターのように強制的に埋めるにはどうすればよいですか?

Takuya HARA :

アブストラクトとコード

私はGolangとNimを学んでいますclassstruct、これらありませんがこれらの種類の言語の初心者です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関数は各構造体に付随する必要があるため、上記のソリューションは冗長であると感じています。この方法は人気がありますか、それともより良い解決策がありますか?

サイラビテハK:

Golangでは、コンストラクターのようなファクトリー関数(上記で定義したものなど)を使用して、構造体を初期化するときにデフォルト値を初期化できます。

はい、これは正しいソリューションであり、そのようなソリューションを選択することにはいくつかの利点があります。それらのいくつかをリストアップしました:

  1. 必要な場合にのみファクトリ関数を実装するので、不要な入力を回避できます。
  2. オブジェクトの構築を完全に制御します。つまり、初期化が成功しない場合は、関数シグネチャをとして持つことで、快適にエラーを返すことができますfunc newPerson(Name string, Age int) (Person, error)コンストラクタではこれは不可能です。
  3. 他の言語でのコンストラクターの実装は、Golangでのファクトリー関数の実装と同じです。

上記の利点とは別に、必要に応じて直接structをインスタンス化できるため、ファクトリ関数はデフォルト値を初期化するための繰り返しを回避するのに役立ちます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

インスタンス化のために構造体のフィールドに制約を追加するにはどうすればよいですか?

分類Dev

Matlabの構造体から別の構造体にフィールド値をエクスポートするにはどうすればよいですか?

分類Dev

リフレクトを使用して構造体のスライスのフィールドを変更するにはどうすればよいですか?

分類Dev

その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

分類Dev

GoでフラットなJSONオブジェクトになるように、埋め込まれた構造体フィールドを持つ構造体をマーシャリングするにはどうすればよいですか?

分類Dev

親の埋め込み構造体フィールド値を取得するにはどうすればよいですか?

分類Dev

matlabの構造体のすべてのフィールドの値を追加するにはどうすればよいですか?

分類Dev

構造体へのポインタを持つ構造体フィールドを取得するにはどうすればよいですか?

分類Dev

Racketでコンパイル時の構造体メタデータを提供しながら構造体コンストラクターをオーバーライドするにはどうすればよいですか?

分類Dev

リフレクトを使用して、構造体フィールドのタイプがインターフェースかどうかを確認するにはどうすればよいですか?

分類Dev

[kotlinデータクラスのコピーメソッドのように]一部のフィールドのみを変更して、不変の構造体をすばやく簡単にコピーするにはどうすればよいですか?

分類Dev

svg :: node :: Valueタプル構造体の単一の文字列フィールドにアクセスするにはどうすればよいですか?

分類Dev

すべてのフィールドに対して `pub`を繰り返さずに、すべてのフィールドがパブリックであるパブリック構造体を作成するにはどうすればよいですか?

分類Dev

テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

分類Dev

テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

分類Dev

外部の関連タイプをローカルの構造体タイプに強制変換するにはどうすればよいですか?

分類Dev

Juliaで構造体のコンストラクターを作成するにはどうすればよいですか?

分類Dev

Goのhtml /テンプレートでマップ要素の構造体フィールドを取得するにはどうすればよいですか?

分類Dev

スライス内の構造体のフィールドを設定するにはどうすればよいですか?

分類Dev

マクロを使用して、構造体フィールドの一意の名前を取得するにはどうすればよいですか?

分類Dev

ルート構造のフィールドが最初に解析され、次に埋め込まれた構造のフィールドが解析されることを確認するにはどうすればよいですか

分類Dev

Vulkanクラスのこの汎用データ構造フィールドを作成するにはどうすればよいですか?

分類Dev

JSONに構造体のフィールドを動的に含めたり除外したりするにはどうすればよいですか?

分類Dev

カスタム構造をスタックに配置してすべてのフィールドにアクセスできるようにするにはどうすればよいですか?

分類Dev

ツールボックスからWindowsフォームにドラッグするときに、ユーザーコントロールの高さを固定するように強制するにはどうすればよいですか?

分類Dev

これらの配列を取得して、構造体のフィールドに入力するにはどうすればよいですか?

分類Dev

1つを除くビットフィールド構造体のすべてのフィールドをクリアするにはどうすればよいですか?

分類Dev

BorrowMutスーパートレイトを使用して、トレイトのデフォルトメソッドの構造体フィールドにアクセスするにはどうすればよいですか?

分類Dev

埋め込まれた構造体のメソッドから構造体を含むフィールドを反映するにはどうすればよいですか?

Related 関連記事

  1. 1

    インスタンス化のために構造体のフィールドに制約を追加するにはどうすればよいですか?

  2. 2

    Matlabの構造体から別の構造体にフィールド値をエクスポートするにはどうすればよいですか?

  3. 3

    リフレクトを使用して構造体のスライスのフィールドを変更するにはどうすればよいですか?

  4. 4

    その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

  5. 5

    GoでフラットなJSONオブジェクトになるように、埋め込まれた構造体フィールドを持つ構造体をマーシャリングするにはどうすればよいですか?

  6. 6

    親の埋め込み構造体フィールド値を取得するにはどうすればよいですか?

  7. 7

    matlabの構造体のすべてのフィールドの値を追加するにはどうすればよいですか?

  8. 8

    構造体へのポインタを持つ構造体フィールドを取得するにはどうすればよいですか?

  9. 9

    Racketでコンパイル時の構造体メタデータを提供しながら構造体コンストラクターをオーバーライドするにはどうすればよいですか?

  10. 10

    リフレクトを使用して、構造体フィールドのタイプがインターフェースかどうかを確認するにはどうすればよいですか?

  11. 11

    [kotlinデータクラスのコピーメソッドのように]一部のフィールドのみを変更して、不変の構造体をすばやく簡単にコピーするにはどうすればよいですか?

  12. 12

    svg :: node :: Valueタプル構造体の単一の文字列フィールドにアクセスするにはどうすればよいですか?

  13. 13

    すべてのフィールドに対して `pub`を繰り返さずに、すべてのフィールドがパブリックであるパブリック構造体を作成するにはどうすればよいですか?

  14. 14

    テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

  15. 15

    テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

  16. 16

    外部の関連タイプをローカルの構造体タイプに強制変換するにはどうすればよいですか?

  17. 17

    Juliaで構造体のコンストラクターを作成するにはどうすればよいですか?

  18. 18

    Goのhtml /テンプレートでマップ要素の構造体フィールドを取得するにはどうすればよいですか?

  19. 19

    スライス内の構造体のフィールドを設定するにはどうすればよいですか?

  20. 20

    マクロを使用して、構造体フィールドの一意の名前を取得するにはどうすればよいですか?

  21. 21

    ルート構造のフィールドが最初に解析され、次に埋め込まれた構造のフィールドが解析されることを確認するにはどうすればよいですか

  22. 22

    Vulkanクラスのこの汎用データ構造フィールドを作成するにはどうすればよいですか?

  23. 23

    JSONに構造体のフィールドを動的に含めたり除外したりするにはどうすればよいですか?

  24. 24

    カスタム構造をスタックに配置してすべてのフィールドにアクセスできるようにするにはどうすればよいですか?

  25. 25

    ツールボックスからWindowsフォームにドラッグするときに、ユーザーコントロールの高さを固定するように強制するにはどうすればよいですか?

  26. 26

    これらの配列を取得して、構造体のフィールドに入力するにはどうすればよいですか?

  27. 27

    1つを除くビットフィールド構造体のすべてのフィールドをクリアするにはどうすればよいですか?

  28. 28

    BorrowMutスーパートレイトを使用して、トレイトのデフォルトメソッドの構造体フィールドにアクセスするにはどうすればよいですか?

  29. 29

    埋め込まれた構造体のメソッドから構造体を含むフィールドを反映するにはどうすればよいですか?

ホットタグ

アーカイブ