以下の内容はhttps://devlights.hatenablog.com/entry/2025/02/20/073000より取得しました。


Goメモ-541 (bytes.Lines)(Go 1.24で追加された関数)

関連記事

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

概要

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

Go 1.24にて、bytesパッケージに bytes.Lines という関数が追加されました。

https://pkg.go.dev/bytes@go1.24.0#Lines

Lines returns an iterator over the newline-terminated lines in the byte slice s. The lines yielded by the iterator include their terminating newlines. If s is empty, the iterator yields no lines at all. If s does not end in a newline, the final yielded line will not end in a newline. It returns a single-use iterator.

(Linesは、バイトスライスs内の改行で終端された行に対するイテレータを返します。イテレータが返す行には、終端の改行も含まれます。 s が空の場合、イテレータは行を生成しない。 s が改行で終わらない場合、最終的に得られる行は改行で終わらない。 これは1回限りのイテレータを返します。)

名前の通り、引数に指定したバイト列を \n で区切ったイテレータを返してくれます。

Go 1.23で追加されたイテレータが活用されてますね。

使い方は自明なのですが、一応自分用にサンプルを以下にメモしておきます。

サンプル

package byteop

import (
    "bytes"
    "fmt"
    "iter"
    "os"
)

// Go124BytesLines は、Go 1.24 で追加された bytes.Lines() のサンプルです.
//
// Go 1.23 で追加されたイテレータを返すようになっています。
// bytes.Lines()は、バイト列を '\n' で区切ったデータをイテレータで提供してくれます。
// このデータには '\n' 自身も付いた状態で取得出来るので、その点には注意が必要。
// (fmt.Println()でそのまま出力すると2個改行が入ることになる)
//
// # REFERENCES
//   - https://pkg.go.dev/bytes@go1.24.0#Lines
//   - https://tip.golang.org/doc/go1.24#bytespkgbytes
//   - https://tip.golang.org/doc/go1.23#iterators
func Go124BytesLines() error {
    var (
        // 最初のN行のみに絞るためのイテレータ関数
        firstN = func(n int, lines iter.Seq[[]byte]) iter.Seq[[]byte] {
            return func(yield func([]byte) bool) {
                count := 0
                for line := range lines {
                    if count >= n || !yield(line) {
                        return
                    }

                    count++
                }
            }
        }
        // 前に番号を付与するイテレータ
        withLineNum = func(lines iter.Seq[[]byte]) iter.Seq[string] {
            return func(yield func(string) bool) {
                count := 1
                for line := range lines {
                    if !yield(fmt.Sprintf("%2d: %s", count, line)) {
                        return
                    }

                    count++
                }
            }
        }

        data, _ = os.ReadFile("README.md") // ファイルデータを読み出して
        lines   = bytes.Lines(data)        // 行単位にして
        first5  = firstN(5, lines)         // 先頭5行のみにして
        withNum = withLineNum(first5)      // 行番号を付与
    )

    for line := range withNum {
        fmt.Printf("%s", line)
    }

    return nil
}

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

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

ENTER EXAMPLE NAME: byteop_go124_bytes_lines

[Name] "byteop_go124_bytes_lines"
 1: 
 2: # try-golang
 3: 
 4: This is my TUTORIAL project for golang.
 5: 


[Elapsed] 127.79µs

参考情報

Goメモ-540 (Go 1.24 リリース)(参考情報リンク) - いろいろ備忘録日記

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


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

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




以上の内容はhttps://devlights.hatenablog.com/entry/2025/02/20/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14