我在StringReader上有一个bufio扫描程序。在扫描仪输出上达到某一行后,我想要阅读直到读者结束。除了注释代码之外,有没有办法用更简单的方法实现这个目的?
s := `1
2
3
4
5
6
7`
beyond5 := ""
scanner := bufio.NewScanner(strings.NewReader(s))
for scanner.Scan() {
if strings.Contains(scanner.Text(), "5") {
// Read all lines until EOF from scanner
// and store in beyond5
// for scanner.Scan() {
// beyond5 += scanner.Text()
// beyond5 += "\n"
// }
break
}
}
log.Println(beyond5)
答案 0 :(得分:1)
扫描仪似乎无法进行这样的操作。我们只需要使用bufio阅读器。代码是:
s := `1
2
3
4
5
6
7`
beyond5 := ""
r := strings.NewReader(s)
reader := bufio.NewReader(r)
for {
line, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
if strings.Contains(line, "5") {
b, _ := ioutil.ReadAll(reader)
beyond5 = string(b)
break
}
}
log.Println(beyond5)
答案 1 :(得分:0)
这是你想要的吗? : - )
s := `1
2
3
4
5
6
7`
var beyond5 string
if strings.Contains(s, "5") {
scanner := bufio.NewScanner(strings.NewReader(s))
for scanner.Scan() {
beyond5 += scanner.Text()
}
}
beyond5 += "\n"
log.Println(beyond5)
更新:我的解决方案类似于@ abhink的解决方案,但是,它们是不同的解决方案
我使用了Split method,此方法将split(private)属性设置为SplitFunc type。这是我的实施:
var canPass bool
func mySplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
for pos, value := range data {
if (value < '6' && !canPass) || (value < '0' || value > '9') {
continue
}
canPass = true
return pos+1, data[pos : pos + 1], nil
}
return 0, nil, nil
}
现在,您必须使用Split方法,将mySplit作为参数发送。
scanner.Split(mySplit)
使用scanner.Scan()
for scanner.Scan() {
beyond5 += scanner.Text() + "\n"
}
输出:
6
7
我希望这是您正在寻找的解决方案: - )