2 回答
TA贡献2051条经验 获得超10个赞
首先,原型bufio.ReadString是
func (b *Reader) ReadString(delim byte) (line string, err error)
它只能将一个字节作为 arg,因此您的;\n分隔符将不起作用。
使用;作为分隔符来代替。
但是如果你使用ReadString(';')它会在你的结果中包含其他字符,比如 '\n'
一个例子:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
const raw = `select * from table1;
select *
from table2;
select 1;`
br := bufio.NewReader(strings.NewReader(raw))
var err error
var s string
err = nil
for err == nil {
s, err = br.ReadString(';')
if err == nil {
fmt.Printf("%q", s)
}
}
这将得到:
"select * from table1;"" \nselect * \nfrom table2;""\n\nselect 1;"
解决方案:
使用Scanner可能更方便,实现如下。
ps:;将被视为单词的一部分
package main
import (
"bufio"
"fmt"
"os"
"strings"
"bytes"
)
func main() {
const raw = `select * from table1;
select *
from table2;
select 1;`
scanner := bufio.NewScanner(strings.NewReader(raw))
scanner.Split(bufio.ScanWords)
var tmpbuf bytes.Buffer
for scanner.Scan() {
w := scanner.Text()
tmpbuf.WriteString(w)
if w[len(w)-1] == ';' {
tmpbuf.WriteString("\n")
fmt.Printf(tmpbuf.String())
tmpbuf.Reset()
} else {
tmpbuf.WriteString(" ")
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err)
}
}
你会得到:
select * from table1;
select * from table2;
select 1;
TA贡献1775条经验 获得超8个赞
您可以使用bufio.Scanner
:https : //golang.org/pkg/bufio/#Scanner 查看行示例:https : //golang.org/pkg/bufio/#example_Scanner_lines
- 2 回答
- 0 关注
- 218 浏览
添加回答
举报