Go では、通常、インターフェイスはデータではなく機能を定義するために使用されます。これは、インターフェイスでメソッドを指定できても、実装では必須フィールドを指定できないことを意味します。
ただし、埋め込み構造体を使用すると、メソッドを通じてデータを公開することでデータを効果的に定義するインターフェイスを作成できます。
次の例を考えてみましょう:
type PersonProvider interface { GetPerson() *Person } type Person struct { Name string Age int64 } func (p *Person) GetPerson() *Person { return p } type Bob struct { FavoriteNumber int64 Person }
この例では、 PersonProvider インターフェイスは、Person オブジェクトへのポインタを返すメソッドを定義します。 Person 構造体には、データ フィールド Name と Age が含まれています。 Bob 構造体は Person 構造体を埋め込み、そのフィールドを効果的に継承します。
関数は、GetPerson() メソッドを通じて埋め込みデータと対話できます:
func SayHi(pp PersonProvider) { fmt.Printf("Hello, %v!\r", pp.GetPerson().Name) } func main() { b := &Bob{ 5, Person{"Bob", 23}, } SayHi(b) fmt.Printf("You're %v years old now!", b.Age) }
この手法により、動作ではなくデータを定義するインターフェイスが可能になります。構造体が具体的なフィールドを公開せずにインターフェイスを実装できるようにすることで、柔軟性が向上します。ただし、ポインタを公開してもデータへの直接アクセスが許可され、追加の柔軟性が制限されることに注意することが重要です。
さらに、Go の規約では、データ アクセスに抽象化を常に使用する必要はありません。多くの場合、埋め込みフィールドまたはパブリック フィールドを介してデータ属性を公開することは許容されます。この手法を検討する場合は、属性を直接公開するよりも大きな利点があるかどうかをケースバイケースで評価することをお勧めします。ゲッターとセッターを介してデータを公開することが、将来の柔軟性や API の互換性にとって重要ではない場合、パブリック属性がより簡単な解決策になる可能性があります。
全体として、ここで紹介した手法は巧妙なトリックではありますが、その必要性を検討することをお勧めします。慎重に、状況によってはより適切な代替アプローチを検討してください。
以上がGo インターフェイスでデータを定義するには、埋め込み構造体を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。