いろいろ備忘録日記

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

Goメモ-412 (指定したオフセットから書き込む)(io.OffsetWriter)

関連記事

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

概要

以下、自分用のメモです。たまに使いたいときに忘れるので、ここにメモメモ。。。

ioパッケージの下には、ある目的に特化したストリームがいろいろあります。

今回は、指定したオフセットから書き込む動きをしてくれる io.OffsetWriter について。

サンプル

package ioop

import (
    "bufio"
    "io"
    "os"
    "path/filepath"

    "github.com/devlights/gomy/errs"
    "github.com/devlights/gomy/output"
)

// OffsetWrite は、io.OffsetWriter を利用したサンプルです。
//
// io.OffsetWriter は、io.WriterAt インターフェースを実装しているものを要求する。
//
// os.File が io.WriterAt を実装している。
//
// # REFERENCES
//   - https://pkg.go.dev/io@go1.22.2#OffsetWriter
//   - https://cs.opensource.google/go/go/+/go1.22.2:src/io/io.go;l=570
func OffsetWrite() error {
    w, err := os.CreateTemp(os.TempDir(), "trygolang")
    if err != nil {
        return err
    }

    fstat := errs.Drop(w.Stat())
    {
        defer w.Close()

        bufW := bufio.NewWriter(w)
        bufW.WriteString("helloworld こんにちは世界")
        bufW.Flush()

        offW := io.NewOffsetWriter(w, 11) // "helloworld " の次の位置(つまり「こ」)にオフセットを設定
        offW.Write([]byte("コンニチハ"))

        offW.Seek(int64(15), io.SeekStart) // "コンニチハ" の次の位置(つまり「世」)にシークポジションをセット
        offW.Write([]byte("セカイ"))
    }

    data := errs.Drop(os.ReadFile(filepath.Join(os.TempDir(), fstat.Name())))
    output.Stdoutl("[offW]", string(data))

    return nil
}

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

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

$ task
task: [build] go build .
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: ioop_offset_write

[Name] "ioop_offset_write"
[offW]               helloworld コンニチハセカイ


[Elapsed] 165.78µs

参考情報

Goのおすすめ書籍


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

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