When implementing a Beanstalkd client in Go, it's necessary to read multiline responses that are delimited by both the newline character (n) and the carriage return character (r). The default function bufio.ReadLine only supports delimiting by n.
To read until the CRLF delimiter, you can use bufio.Scanner with a custom SplitFunc function:
<code class="go">import ( "bufio" "fmt" "io" "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 { return i + 2, dropCR(data[0:i]), nil } if atEOF { return len(data), dropCR(data), nil } return 0, nil, nil }</code>
In this case, dropCR removes the trailing 'r' character from the token.
You can then use a bufio.Scanner with the ScanCRLF function to read the data:
<code class="go">scanner := bufio.NewScanner(this.reader) scanner.Split(ScanCRLF) for scanner.Scan() { fmt.Println(scanner.Text()) }</code>
Alternatively, bufio.NewReaderSize can be used to read a specific length:
<code class="go">var nr_of_bytes int nr_of_bytes, _ = strconv.Atoi(res) buf := make([]byte, nr_of_bytes) _, _ = io.ReadAtLeast(this.reader,buf, nr_of_bytes)</code>
The above is the detailed content of How to Read Multiline Responses with CR/LF Delimiter in Go?. For more information, please follow other related articles on the PHP Chinese website!