はじめに
船井総研デジタルの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インタフェースの概要など詳細を下記記事にまとめてくださっています。
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] = ""
おわりに
今回はここまでです。