いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-402 (複数のio.Readerを一括で読み込み)(io.MultiReader)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

少し前に io.MultiWriter についてのメモを書いたので、ついでに io.MultiReader についてのメモです。

devlights.hatenablog.com

io.MultiReader も意外と知らない人が周りには多かったです。便利ですよ。

サンプル

package ioop

import (
    "fmt"
    "io"
    "os"
)

// MultiRead は、io.MultiReaderを利用して複数のファイルを一気に読み込むサンプルです。
//
// > MultiReader returns a Reader that's the logical concatenation of the provided input readers.
// They're read sequentially. Once all inputs have returned EOF, Read will return EOF.
// If any of the readers return a non-nil, non-EOF error, Read will return that error.
//
// > MultiReaderは、与えられた入力リーダーを論理的に連結したリーダーを返します。
// 順次読み込まれ、すべての入力がEOFを返したらEOFを返します。
// いずれかのリーダがEOF以外のエラーを返した場合、Readはそのエラーを返します。
//
// # REFERENCES
//
//   - https://pkg.go.dev/io@go1.22.2#MultiReader
func MultiRead() error {
    const (
        F1 = "go.mod"
        F2 = ".gitpod.yml"
        F3 = "main.go"
    )

    var (
        f1, f2, f3 *os.File
        err        error
    )

    if f1, err = os.Open(F1); err != nil {
        return err
    }
    defer f1.Close()

    if f2, err = os.Open(F2); err != nil {
        return err
    }
    defer f2.Close()

    if f3, err = os.Open(F3); err != nil {
        return err
    }
    defer f3.Close()

    var (
        r   = io.MultiReader(f1, f2, f3)
        buf []byte
    )

    buf, err = io.ReadAll(r)
    if err != nil {
        return err
    }

    fmt.Println(string(buf))

    return nil
}

try-golang/examples/basic/ioop/multiread.go at main · devlights/try-golang · GitHub

実行すると以下のようになります。

$ task
task: Task "build" is up to date
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: ioop_multiread

[Name] "ioop_multireader"
module github.com/devlights/try-golang

go 1.22

require (
        github.com/devlights/gomy v0.6.0
        github.com/pelletier/go-toml/v2 v2.2.1
        github.com/shopspring/decimal v1.4.0
        golang.org/x/crypto v0.22.0
        golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8
        golang.org/x/sync v0.7.0
        golang.org/x/term v0.19.0
        golang.org/x/text v0.14.0
        gopkg.in/ini.v1 v1.67.0
        gopkg.in/natefinch/lumberjack.v2 v2.2.1
        gopkg.in/yaml.v3 v3.0.1
)

require golang.org/x/sys v0.19.0 // indirect
image:
  file: .gitpod.Dockerfile

tasks:
  - name: initial
    init:
      go install github.com/go-task/task/v3/cmd/task@latest &&
      go install honnef.co/go/tools/cmd/staticcheck@latest &&
      go install golang.org/x/tools/cmd/goimports@latest &&
      go install github.com/go-delve/delve/cmd/dlv@latest &&
      task build
    command:
      go version


vscode:
  extensions:
    - golang.go
    - TakumiI.markdowntable
package main

import "github.com/devlights/try-golang/cmd"

func main() {
        cmd.Execute()
}



[Elapsed] 130.07µs

参考情報

https://pkg.go.dev/io@go1.22.2#MultiReader

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。