Home  >  Article  >  Backend Development  >  How to Read Data until CRLF Delimiter in Golang using bufio.Scanner?

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

DDD
DDDOriginal
2024-10-28 07:14:01747browse

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>

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>

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>

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!

Statement:
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