はじめに
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
メソッドを持つ他のすべての型を引数として受け取ることができます。