Go におけるオブジェクト指向入門
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 5/107。
Goにはクラスはありませんが、構造体とメソッドを通じてオブジェクト指向プログラミングを実現します。構造体は関連するデータをグループ化し、メソッドはその構造体に紐付けられた振る舞いを定義します。
データを保持するための構造体を定義します
type Dog struct {
Name string
Age int
}構造体にメソッドを追加します
func (d Dog) Bark() string {
return d.Name + " says Woof!"
}インスタンスを作成して使用する
package main
import "fmt"
type Dog struct {
Name string
Age int
}
func (d Dog) Bark() string {
return d.Name + " says Woof!"
}
func main() {
myDog := Dog{Name: "Buddy", Age: 3}
fmt.Println(myDog.Bark()) // 出力: Buddy says Woof!
fmt.Println(myDog.Age) // 出力: 3
}Goでは、メソッド名の前にある(d Dog)という部分は、レシーバと呼ばれます。これはメソッドをDog構造体に結びつけるもので、他の言語においてメソッドがクラスに属する仕組みと似ています。
チャレンジ
簡単GoのOOPへのアプローチを練習するために、メソッドを持つ Cat 構造体を作成してください:
Name(string) とAge(int) フィールドを持つCat構造体を定義します- 猫の名前の後に
" says Meow!"が続く文字列を返すSpeakメソッドを追加します
チートシート
Goは、構造体 (structs)とメソッド (methods)を通じてオブジェクト指向プログラミングを実現します。構造体は関連するデータをグループ化し、メソッドはその構造体に紐付けられた振る舞いを定義します。
データを保持するための構造体を定義します:
type Dog struct {
Name string
Age int
}レシーバ (receiver)を使用して、構造体にメソッドを紐付けます:
func (d Dog) Bark() string {
return d.Name + " says Woof!"
}メソッド名の前にある (d Dog) の部分はレシーバであり、メソッドを構造体に接続します。
インスタンスを作成して使用します:
myDog := Dog{Name: "Buddy", Age: 3}
fmt.Println(myDog.Bark()) // 出力: Buddy says Woof!
fmt.Println(myDog.Age) // 出力: 3自分で試してみよう
package main
import "fmt"
func main() {
var name string
var age int
fmt.Scan(&name, &age)
cat := Cat{Name: name, Age: age}
fmt.Printf("Name: %s\n", cat.Name)
fmt.Printf("Age: %d\n", cat.Age)
fmt.Println(cat.Speak())
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー