0Pricing
Go Academy · レッスン

標準ライブラリの主要インターフェース

fmt.Stringer、io.Reader、io.Writer

「標準ライブラリの主要インターフェース」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

fmt.Stringer

fmt.Stringerはメソッドを1つ持ちます: String() string。これを実装すると、fmt.Printlnや%vで型をどのように表示するかを制御できます:

package main
import "fmt"

type Color int
const (Red Color = iota; Green; Blue)
func (c Color) String() string {
    return []string{"Red","Green","Blue"}[c]
}

func main() {
    fmt.Println(Red, Green, Blue) // Red Green Blue
}

errorインターフェース

組み込みのerrorインターフェースはメソッドを1つ持ちます: Error() string。これを実装する型は、エラーとして使用できます:

package main
import "fmt"

type ValidationError struct{ Field, Msg string }
func (e *ValidationError) Error() string {
    return e.Field + ": " + e.Msg
}

func validate(age int) error {
    if age < 0 { return &ValidationError{"age", "must be non-negative"} }
    return nil
}

func main() {
    fmt.Println(validate(-1))
}

io.Reader

io.Readerはメソッドを1つ持ちます: Read(p []byte) (n int, err error)。ファイル、HTTPボディ、文字列、バッファはすべてこれを実装しています:

package main
import ("fmt"; "strings")

func countBytes(r interface{ Read([]byte)(int,error) }) int {
    buf := make([]byte, 512)
    total := 0
    for {
        n, err := r.Read(buf)
        total += n
        if err != nil { break }
    }
    return total
}

func main() {
    r := strings.NewReader("hello world")
    fmt.Println(countBytes(r)) // 11
}

io.Writer

io.Writerはメソッドを1つ持ちます: Write(p []byte) (n int, err error)。fmt.Fprintf、ロギング、HTTPレスポンスライターなどで使われます:

package main
import ("bytes"; "fmt")

func main() {
    var buf bytes.Buffer
    fmt.Fprintf(&buf, "Hello, %s!", "Go")
    fmt.Println(buf.String()) // Hello, Go!
}

io.ReadWriterとio.Closer

標準ライブラリでは、小さなインターフェースを組み合わせて、より大きなインターフェースを作ります:

package main
import "io"

// io.ReadWriter = io.Reader + io.Writer
// io.ReadCloser = io.Reader + io.Closer
// io.ReadWriteCloser = all three

func process(rw io.ReadWriter) {
    buf := make([]byte, 8)
    rw.Read(buf)
    rw.Write(buf)
}

func main() { _ = process }

sort.Interface

sort.Interfaceには、Len() int、Less(i, j int) bool、Swap(i, j int)が必要です:

package main
import ("fmt"; "sort")

type ByLength []string
func (b ByLength) Len() int           { return len(b) }
func (b ByLength) Less(i, j int) bool { return len(b[i]) < len(b[j]) }
func (b ByLength) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }

func main() {
    fruits := ByLength{"banana","apple","kiwi"}
    sort.Sort(fruits)
    fmt.Println([]string(fruits)) // [kiwi apple banana]
}

http.Handler

http.Handlerはメソッドを1つ持ちます: ServeHTTP(ResponseWriter, *Request)。GoのHTTPスタックはすべて、この単一のインターフェースを基盤に構築されています:

package main
import ("fmt"; "net/http")

type Hello struct{}
func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
}

func main() {
    http.ListenAndServe(":8080", Hello{})
}

fmt.GoStringer

GoString() stringを実装すると、型の%#v(Go構文)表現を制御できます:

package main
import "fmt"

type Version struct{ Major, Minor int }
func (v Version) GoString() string {
    return fmt.Sprintf("Version{%d, %d}", v.Major, v.Minor)
}

func main() {
    fmt.Printf("%#v\n", Version{1, 18}) // Version{1, 18}
}

encoding.TextMarshaler

独自のテキストエンコーディング(JSON文字列、YAMLなど)には、MarshalText() ([]byte, error)とUnmarshalText([]byte) errorを実装します:

package main
import "fmt"

type Status int
const (Active Status = iota; Inactive)
func (s Status) MarshalText() ([]byte, error) {
    if s == Active { return []byte("active"), nil }
    return []byte("inactive"), nil
}

func main() {
    s := Active
    b, _ := s.MarshalText()
    fmt.Println(string(b)) // active
}

標準インターフェースの組み合わせ

io.TeeReaderやio.MultiWriterなどを使って標準インターフェースを組み合わせると、新しい型を作成せずに強力なパイプラインを構築できます:

package main
import ("bytes"; "fmt"; "io"; "strings")

func main() {
    r := strings.NewReader("hello")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)
    io.ReadAll(tee)
    fmt.Println(buf.String()) // hello
}

確認問題

Goで型をエラーとして使うには、どのインターフェースを実装する必要がありますか?

まとめ

標準ライブラリの主要なインターフェース:

  • fmt.Stringer — カスタム出力表現
  • error — エラー値
  • io.Reader / io.Writer — ストリーミングI/O
  • sort.Interface — カスタムソート
  • http.Handler — HTTPリクエスト処理

練習課題

Person(NameフィールドとAgeフィールドを持つ)の[]Personにsort.Interfaceを実装し、年齢の降順に並べ替えてください。並べ替えたリストを出力してください。

よくある質問

「標準ライブラリの主要インターフェース」レッスンは無料ですか?

はい。「標準ライブラリの主要インターフェース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「標準ライブラリの主要インターフェース」で何を学びますか?

fmt.Stringer、io.Reader、io.Writer ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「標準ライブラリの主要インターフェース」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. インターフェースの定義と実装
  2. 標準ライブラリの主要インターフェース
  3. 型アサーションと型switch
  4. インターフェースのコンポジションとベストプラクティス
← Go Academyに戻る