Go のベスト プラクティス: 共有フィールドを持つ類似の構造体の関数の管理
Go では、類似したフィールドを持つ複数の構造体に遭遇するのが一般的です。それらに対して同じ操作を実行する必要があります。柔軟性を維持しながらコードの繰り返しを回避するには、次の戦略を検討してください:
共有フィールドのカスタム タイプの作成:
共有フィールドが単純なデータ型の場合 (例: string)、そのカスタム タイプを定義することを検討してください。これにより、カスタム型にメソッドをアタッチできるようになり、その型を埋め込む任意の構造体で使用できるようになります。
type Version string
func (v Version) PrintVersion() {
fmt.Println("Version is", v)
}
次に、バージョン タイプを構造体に埋め込みます。
type Game struct {
Name string
MultiplayerSupport bool
Genre string
Version
}
type ERP struct {
Name string
MRPSupport bool
SupportedDatabases []string
Version
}
これにより、Version フィールドの PrintVersion メソッドを使用してバージョンを印刷できるようになります:
g.PrintVersion()
e.PrintVersion()
リフレクションの使用:
共有フィールドに異なるタイプを使用できる場合、またはより柔軟性が必要な場合は、リフレクションを使用して適切なフィールドを動的に呼び出すことができます。方法。このアプローチはより複雑で、パフォーマンスに多少の影響を及ぼしますが、柔軟性が高まります。
type Printer interface {
PrintVersion() error
}
func PrintVersion(p Printer) error {
t := reflect.TypeOf(p)
method, ok := t.MethodByName("PrintVersion")
if !ok {
return fmt.Errorf("object doesn't have a PrintVersion method")
}
return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}
その後、PrintVersion 関数を使用して、Printer インターフェイスを実装する任意のオブジェクトで PrintVersion メソッドを呼び出すことができます。
var game Game
var erp ERP
PrintVersion(game)
PrintVersion(erp)
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3