Есть ли в Rust что-нибудь похожее на bufio.Reader.ReadSlice в Go? - PullRequest
2 голосов
/ 07 марта 2020

В Go, bufio.Reader имеет метод ReadSlice, который считывает до разделителя и возвращает срез, представляющий данные. Возвращенный фрагмент по сути является представлением внутреннего буфера. Следовательно, в этот процесс не вовлечено копирование буфера, хотя он не может выполнять такие операции, как чтение строк длиннее внутреннего размера буфера.

Есть ли что-то похожее на это (чтение до разделителя без копирования) в Rust стандартная библиотека или любые сторонние ящики?

1 Ответ

2 голосов
/ 07 марта 2020

См. read_until :
Считать все байты в buf, пока не будет достигнут байт разделителя или EOF.

Эта функция будет считывать байты из нижележащего потока, пока разделитель или EOF не будет нашел. После обнаружения все байты до и включая разделитель (если он найден) будут добавлены в buf. * ​​1006 *

В случае успеха эта функция вернет общее количество прочитанных байтов.

Пример в ржавчине:

fn main() {
    use std::io::{self, BufRead};
    let mut cursor = io::Cursor::new(b"a-b-c");
    let mut buf = vec![];
    let num_bytes = cursor
        .read_until(b'-', &mut buf)
        .expect("reading from cursor won't fail");
    println!("{}", num_bytes); // 2
    println!("{:?}", buf); // [97, 45]
    let s = String::from_utf8(buf).expect("Invalid UTF-8");
    println!("{}", s); // a-
}

Пример в Go:

package main

import (
    "bufio"
    "fmt"
    "log"
    "strings"
)

func main() {
    s := `a-b-c`
    r := strings.NewReader(s)    // type Reader interface { Read(p []byte) (n int, err error) }
    br := bufio.NewReader(r)     // NewReaderSize(4096)
    bs, err := br.ReadSlice('-') // reads to the internal buffer
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(bs)         // [97 45]
    fmt.Println(string(bs)) //a-
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...