Go言語学習5日目:インターフェースとエラーハンドリングを学んでみた。

Go言語学習、ついに5日目!

今日のテーマはちょっとレベルアップして…

  • インターフェース(interface)
  • エラーハンドリング(error型とif err != nil)

この2つにチャレンジしてみました!

これまでの活動はコチラ

kunio-ud-all.com


インターフェースって何者?

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にとってはちょっと難しく感じるパートかもしれませんが、
例え話や具体的なコードとセットで覚えると意外と理解できるかも。。

インターフェースの考え方は新しいので、取り入れていけるようになりたい。


(この記事は広告を含みます)