string - 从阅读器读取直到到达一个字符串

标签 string go

我正在尝试编写一个函数来继续从缓冲读取器读取数据,直到我遇到某个字符串,然后停止读取并返回在该字符串之前读取的所有内容。

换句话说,我想做与 reader.ReadString() 相同的事情,除了采用字符串而不是单个字节。

例如:

mydata, err := reader.ReadString("\r\n.\r\n") //obviously will not compile

我该怎么做?

提前致谢

三毛

修正案 1:之前的尝试

这是我之前的尝试;它写得不好而且不起作用,但希望它能展示我正在尝试做的事情。

func readDotData(reader *bufio.Reader)(string, error){
delims := []byte{ '\r', '\n', '.', '\r', '\n'}
curpos := 0
var buffer []byte
for {
    curpos = 0
    data, err := reader.ReadSlice(delims[0])
    if err!=nil{ return "", err }
    buffer = append(buffer, data...)
    for {
        curpos++
        b, err := reader.ReadByte()
        if err!=nil{ return "", err }
        if b!=delims[curpos]{
            for curpos >= 0{
                buffer = append(buffer, delims[curpos])
                curpos--
            }
            break
        }
        if curpos == len(delims){
            return string(buffer[len(buffer)-1:]), nil
        }
    }
}
panic("unreachable")
}

最佳答案

package main

import (
        "bytes"
        "fmt"
        "log"
)

type reader interface {
        ReadString(delim byte) (line string, err error)
}

func read(r reader, delim []byte) (line []byte, err error) {
        for {
                s := ""
                s, err = r.ReadString(delim[len(delim)-1])
                if err != nil {
                        return
                }

                line = append(line, []byte(s)...)
                if bytes.HasSuffix(line, delim) {
                        return line[:len(line)-len(delim)], nil
                }
        }
}

func main() {
        src := bytes.NewBufferString("123deli456elim789delimABCdelimDEF")
        for {
                b, err := read(src, []byte("delim"))
                if err != nil {
                        log.Fatal(err)
                }

                fmt.Printf("%q\n", b)
        }
}

Playground


输出:

"123deli456elim789"
"ABC"
2009/11/10 23:00:00 EOF

关于string - 从阅读器读取直到到达一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916912/

相关文章:

c - 如何从C中的文件中获取带空格的字符串

go - 奇怪的编译错误说 'no buildable Go source files'

go - 基于Go的grpc服务器流不断堆积响应以转到go客户端

docker - 使用 Go Docker API 从挂载文件获取文件上下文

c++ - 将命令行解析为 argv 数组

python - 在python中拆分逗号分隔的字符串

java - 如何删除字符串Java中所有出现的单词

python - 列出所有可能的随机 3 个字符或 4 个字符

inheritance - 从没有将类型转换为继承类型的继承结构执行实际对象方法

c++ - 这些编程语言的 headless 浏览器库