Lors de l'implémentation d'un client Beanstalkd dans Go, il est nécessaire de lire les réponses multilignes délimitées par le caractère de nouvelle ligne (n) et le caractère de retour chariot (r). La fonction par défaut bufio.ReadLine ne prend en charge que la délimitation par n.
Pour lire jusqu'au délimiteur CRLF, vous pouvez utiliser bufio.Scanner avec une fonction SplitFunc personnalisée :
<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>
Dans ce cas, dropCR supprime le caractère « r » de fin du jeton.
Vous pouvez ensuite utiliser un bufio.Scanner avec la fonction ScanCRLF pour lire les données :
<code class="go">scanner := bufio.NewScanner(this.reader) scanner.Split(ScanCRLF) for scanner.Scan() { fmt.Println(scanner.Text()) }</code>
Alternativement, bufio.NewReaderSize peut être utilisé pour lire une longueur spécifique :
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!