はじめに
Go言語におけるオブジェクト指向プログラミングの基本的な概念について記載します。
Go言語は、クラスや継承といった伝統的なオブジェクト指向プログラミングの概念を持っていません。
その代わり、Goでは構造体(Structs)とインターフェース(Interfaces)という独自の概念を用います。
構造体とは?
Go言語の基本的なデータ型の一つが構造体です。これは関連するデータを一つにまとめるための型で、その中には異なる型のフィールドを持つことができます。以下に例を示します。
type Person struct {
Name string
Age int
}
ここでは、Personという名前の新しい型を定義しています。この型はName(文字列型)とAge(整数型)の2つのフィールドを持つ構造体です。
そして、このPerson型の値を作成するには以下のようにします。
p := Person{Name: "Alice", Age: 30}
メソッドとは?
Go言語では、特定の型に紐づけられた関数をメソッドと呼びます。これにより、その型の値(オブジェクト)がそのメソッドを"持つ"と言うことができます。以下に例を示します。
func (p Person) SayHello() {
fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.Name, p.Age)
}
上記の例では、Person型の値に対してSayHelloメソッドを定義しています。このメソッドを呼び出すには以下のようにします。
p := Person{Name: "Alice", Age: 30}
p.SayHello()
このコードは"Hello, my name is Alice and I'm 30 years old."と出力します。
インターフェースとは?
Go言語のインターフェースは、メソッドのシグネチャの集合を定義します。ある型がインターフェースのすべてのメソッドを持っている場合、その型はそのインターフェースを"実装"していると言えます。
type Greeter interface {
SayHello()
}
上記の例では、SayHelloメソッドを持つすべての型はGreeterインターフェースを実装していると言えます。したがって、Person型はGreeterインターフェースを実装しています。
これにより、Greeterインターフェースを要求する関数やメソッドを作成し、任意のGreeterを引数として受け取ることができます。
func Greet(g Greeter) {
g.SayHello()
}
この関数Greetは任意のGreeterを引数として受け取り、そのSayHelloメソッドを呼び出します。
これにより、Person型だけでなく、SayHelloメソッドを持つ他のすべての型を引数として受け取ることができます。