How to Read Data until CRLF Delimiter in Golang using bufio.Scanner?

DDD
Release: 2024-10-28 07:14:01
Original
755 people have browsed it

How to Read Data until CRLF Delimiter in Golang using bufio.Scanner?

How to Read Multiline Data Until CRLF Delimiter in Golang with bufio

In Golang's bufio package, the ReadBytes, ReadSlice, and ReadString functions are commonly used for reading data delimited by specific bytes or strings. However, none of these functions provide an easy way to read data until a CRLF delimiter, as required in Beanstalkd's protocol.

Using bufio.Scanner

A better approach is to use the bufio.Scanner type to create a custom split function that looks for CRLF delimiters. This allows you to read data until a CRLF delimiter is encountered. Here's how to do it:

<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>
Copy after login

Using Your Custom Scanner

Now, you can wrap your io.Reader with your custom scanner and use it to read data until CRLF delimiters:

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

for scanner.Scan() {
    fmt.Println(scanner.Text())
}

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

Alternative Approach: Reading a Specific Number of Bytes

You can also read a specific number of bytes if you know the expected number of bytes in the data. However, this approach is less robust and requires careful validation to ensure that you're not reading too much or too little data. To read a specific number of bytes using the bufio.Reader type:

<code class="go">nr_of_bytes := read_number_of_butes_somehow(conn)
buf := make([]byte, nr_of_bytes)
reader.Read(buf)</code>
Copy after login

Handling Error Conditions

Both the above approaches require careful handling of error conditions, especially when dealing with partial reads and premature EOFs. Ensure that you validate the input and handle errors as appropriate.

The above is the detailed content of How to Read Data until CRLF Delimiter in Golang using bufio.Scanner?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!