ホームページ  >  記事  >  バックエンド開発  >  GoでCRLFで区切られた複数行のデータを読み取る方法は?

GoでCRLFで区切られた複数行のデータを読み取る方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 20:09:29101ブラウズ

How to Read Multi-Line Data Delimited by CRLF in Go?

Go で CRLF で区切られた複数行のデータを読み取る

複数行のメッセージを送信するプロトコルを使用する場合、行で区切られたデータを効率的に処理する必要があります。この場合、区切り文字シーケンス CRLF が発生するまでバッファからデータを読み取る方法について疑問が生じます。

カスタム bufio.SplitFunc の使用

この課題に対処する 1 つの解決策は、次のとおりです。 CRLF シーケンスを行終端として認識するカスタム bufio.SplitFunc を定義します。以下に実装例を示します。

<code class="go">import (
    "bufio"
    "bytes"
)

func ScanCRLF(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }
    if i := bytes.Index(data, []byte{'\r', '\n'}); i >= 0 {
        // We have a full newline-terminated line.
        return i + 2, dropCR(data[0:i]), nil
    }
    // If we're at EOF, we have a final, non-terminated line. Return it.
    if atEOF {
        return len(data), dropCR(data), nil
    }
    // Request more data.
    return 0, nil, nil
}

func dropCR(data []byte) []byte {
    if len(data) > 0 && data[len(data)-1] == '\r' {
        return data[0 : len(data)-1]
    }
    return data
}</code>

この ScanCRLF 関数は、CRLF 区切り文字に基づいてデータを分割するために使用できます。

スキャナによるリーダーのラッピング

カスタム ScanCRLF 関数を使用すると、元の io.Reader を bufio.Scanner でラップすると、データをより効率的に読み取ることができます。

<code class="go">scanner := bufio.NewScanner(r)
scanner.Split(ScanCRLF)

// Read chunks of data until EOF
for scanner.Scan() {
    fmt.Printf("%s\n", scanner.Text())
}

if err := scanner.Err(); err != nil {
    fmt.Printf("Invalid input: %s", err)
}</code>

予期しないバイト カウンターの処理

に基づいて特定のバイト数を読み取るという代替案バイト カウンタは、カウンタ自体の潜在的なエラーにより信頼できない場合があります。カウンタの予期しない値や不正な値は、データの破損やメッセージの切り捨てにつながる可能性があります。

そのため、推奨されるアプローチは、ステート マシンのようなメカニズムを使用して、コマンドや予期される本文の長さを含むプロトコルを解析することです。そして、この期待値に対して実際の体長を検証します。これにより、データの整合性と堅牢性が保証されます。

以上がGoでCRLFで区切られた複数行のデータを読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。