Go言語学習、ついに5日目!
今日のテーマはちょっとレベルアップして…
- インターフェース(interface)
- エラーハンドリング(error型とif err != nil)
この2つにチャレンジしてみました!
これまでの活動はコチラ
インターフェースって何者?
Goではインターフェースは「この機能(メソッド)を持ってるものなら何でもOK」という超ざっくりルール。
まずはサンプルコード👇
package main import "fmt" type Greeter interface { Greet() string } type Person struct { Name string } func (p Person) Greet() string { return "こんにちは、" + p.Name + "です!" } func sayHello(g Greeter) { fmt.Println(g.Greet()) } func main() { p := Person{Name: "たろう"} sayHello(p) // Person型だけど Greeter として使える! }
インターフェースのポイント
- 「このメソッド持ってたらこの型でもOK」という柔らかい設計
- Goでは 明示的にimplementsしなくていい!(自動的に適合)
- 異なる型に対して共通処理をしたいときに便利
Rustっぽい?Rustをそこまで知らないけど。。。
もう少し理解を深めるために
-「しゃべる人」インターフェースを作ってみる - 「犬」も追加する
package main import "fmt" // インターフェース定義:「しゃべれる」ことが条件 type Speaker interface { Speak() string } // 人の構造体 type Person struct { Name string } // 犬の構造体 type Dog struct { Name string } // Personに Speak メソッドを実装 func (p Person) Speak() string { return "こんにちは、" + p.Name + "です。" } // Dog にも Speak メソッドを実装 func (d Dog) Speak() string { return d.Name + ":ワン!" } // Speakerインターフェースを受け取る関数 func greet(s Speaker) { fmt.Println(s.Speak()) } func main() { p := Person{Name: "たろう"} d := Dog{Name: "ポチ"} greet(p) // Person型だけど、Speakerとして使える greet(d) // Dog型だけど、Speakerとして使える }
なんとフレキシブル。後から追加できるなんて。 「クラス図命!」って人には、ちょっと拍子抜けになるかもね。
error型とエラーハンドリング
Goでは例外(try/catch)ではなく、エラーを値として扱うのが特徴的です。
典型的なパターン:if err != nil
package main import ( "errors" "fmt" ) func divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("0で割ることはできません") } return a / b, nil } func main() { result, err := divide(10, 0) if err != nil { fmt.Println("エラー:", err) return } fmt.Println("結果:", result) }
error型の扱い方
- エラーが起きたら
error
を返す(値はnil
じゃない) if err != nil
でエラーチェックするのがGoの文化- 「エラーは例外じゃない。普通の戻り値として扱う」という思想
pythonでも、TypeScriptでも返せるからここはすんなり入るかな。 「結果とエラーを同時に返す」というのがGoっぽい設計になるのかもね
インターフェース × エラーハンドリング
実際のアプリ開発では、インターフェースとエラーハンドリングが組み合わさって登場します。
たとえば、ファイル操作、ネットワーク通信、API呼び出しなど、エラーが発生しうる処理を抽象化して扱うときに大活躍!
今は「そういう世界があるんだ〜」くらいの感覚でOK!
今日のまとめ
Go言語5日目の学習ポイントまとめ
- インターフェースは「このメソッド持ってればOK」という柔軟な設計
interface
型は共通処理を抽象化するときに使える- Goでは
error
型でエラーを返し、if err != nil
で処理するのが基本 - try/catch じゃない!「戻り値でエラー処理」がGoらしさ
文系SEにとってはちょっと難しく感じるパートかもしれませんが、
例え話や具体的なコードとセットで覚えると意外と理解できるかも。。
インターフェースの考え方は新しいので、取り入れていけるようになりたい。