ホームページ  >  記事  >  バックエンド開発  >  可変構造体の動作を記述する Go 型制約

可変構造体の動作を記述する Go 型制約

WBOY
WBOY転載
2024-02-08 21:15:10610ブラウズ

描述可变结构行为的 Go 类型约束

php エディタ Xinyi は本日、変数構造の動作を記述する Go 型制約を導入しました。 Go 言語では、インターフェイス型を使用して一連のメソッドを定義し、型制約を通じて受信パラメーターの型を制限できます。このメソッドは、コンパイル時に型チェックを実行して、コードの安全性と信頼性を確保できます。インターフェイスの型と型の制約を合理的に使用することで、コードの柔軟性と拡張性を実現し、プログラムの保守性と可読性を向上させることができます。次に、Go 型制約を使用して可変構造体の動作を記述する方法を詳しく見てみましょう。

質問内容

型制約によって可変構造体の動作を記述するジェネリック関数を定義したいと考えています。

「可変動作」とは次のようなインターフェースのことです:

リーリー

...実装は次のようになります:

リーリー

インターフェイス メソッド を呼び出すと、 構造が変更されます。

私がやりたいのは、型制約が上記のインターフェイスであるジェネリック関数を定義することです。ジェネリック関数は、具象型のインスタンスを初期化し、インターフェイス メソッドを使用してそれを変更し、それを返す役割を果たします。

リーリー

それでは、Foo 型を使用してこの汎用関数を呼び出せるようにしたいと考えています。

リーリー

#Foo へのポインタのみが Unmarshaler インターフェイスを実装するため、*Foo を型パラメータとして渡す必要があります。ただし、Foo の Unmarshal メソッドが fnil 値を受け取ると、パニックが発生します。 var m TFoo へのポインタの値をゼロ、つまり nil にするので、これはすべて私にとっては理にかなっています。でも、行き止まりになったかどうかはわかりません。

https://go.dev/play/p/H5s59NWNiDA

私ができる限りのことを説明すると、変更可能な構造体の動作を記述する型制約があり、ジェネリック関数が構造体のインスタンスを初期化してから変更したい場合に、この問題に遭遇します。出来ますか?これを構築するより良い方法はありますか?

解決策

中心的な問題は、特定の型

T に有用な値を作成することです。これを行うにはいくつかの方法があります: m := make(T) (マップとチャネル) など。 reflect パッケージを使用して値を作成することもできますが、呼び出し元に値をパラメーターとして渡す方が簡単です。 リーリー

次のように関数を呼び出します:

リーリー

https://www.php.cn/link/8eb51d0a68e9373df41f88e5b551d4a3

以上が可変構造体の動作を記述する Go 型制約の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。