在 Go 中,bufio.Reader
有一个方法 ReadSlice
它读取直到分隔符并返回表示数据的切片。返回的切片本质上是内部缓冲区的 View 。因此,此过程中不涉及缓冲区的复制,尽管它不能执行诸如读取长于内部缓冲区大小的行之类的操作。
在 Rust 标准库或任何第三方 crate 中是否有类似的东西(阅读直到分隔符而不复制)?
最佳答案
见 read_until :
将所有字节读入 buf 直到达到分隔符字节或 EOF。
此函数将从底层流中读取字节,直到找到分隔符或 EOF。一旦找到,直到并包括分隔符(如果找到)的所有字节都将附加到 buf。
如果成功,此函数将返回读取的总字节数。
Rust 中的示例:
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-
}
关于rust - Rust 中有没有类似于 Go 中的 bufio.Reader.ReadSlice 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60581128/