3
1

More than 1 year has passed since last update.

Go言語入門 学習メモ 10 io.Readerインタフェース

Posted at

はじめに

船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

対象読者

  • これからGo言語を学習する方
  • 既に他の言語で基本構文を学習されている方

学習環境

学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。

  • Windows 11 Home / 22H2
  • VSCode / 1.72.2
  • go version go1.19.2 windows/amd64
  • git version 2.38.0.windows.1

前回までの学習

前回は Stringerインタフェース、Errorインタフェース を学習しました。

io.Readerインタフェース

io.Readerインタフェースはデータ読み込みの振る舞いを定義しています。Goの標準ライブラリはファイル、ネットワーク、圧縮、暗号化など多くの操作でこのインタフェースを実装しているようです。

インタフェースの実装は Read(p []byte) (n int, err error) が宣言されています。io.Readerインタフェースの概要など詳細を下記記事にまとめてくださっています。

io.go
type Reader interface {
	Read(p []byte) (n int, err error)
}

次のサンプルでは標準ライブラリのstringsパッケージを使って文字列を定義、readでその文字列を読み込みます。

Readの振る舞いとしては渡すバッファの要素分を読み込み、読み込んだデータ数とエラー情報を返すようです。全て読み込みが完了するとerrにio.EOFを返します。また読み込んだ文字列は渡したバッファがスライスなのでその中に入ります。

サンプルコード
package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r   := strings.NewReader("HEEEEELO, World")
	buf := make([]byte, 8)

	for {
		// バッファに読み込み
		num, err := r.Read(buf)

		fmt.Printf("num = %d, err = %v buf = %v\n", num, err, buf)
		fmt.Printf("buf[:num] = %q\n\n", buf[:num])

		// 読み込み後にEOFに達していれば
		if err == io.EOF {
			break
		}
	}
}
実行結果
num = 8, err = <nil> buf = [72 69 69 69 69 69 76 79]
buf[:num] = "HEEEEELO"

num = 7, err = <nil> buf = [44 32 87 111 114 108 100 79]
buf[:num] = ", World"

num = 0, err = EOF buf = [44 32 87 111 114 108 100 79]
buf[:num] = ""

おわりに

今回はここまでです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1