我正在写一段小段落来编号:
这是我的计划:
package main
import (
"fmt"
"io/ioutil"
)
var s_end = [3]string{".", "!", "?"}
func main() {
b, err := ioutil.ReadFile("i_have_a_dream.txt")
if err != nil {
panic(err)
}
p_num, s_num := 1, 1
for _, char := range b {
fmt.Printf("[%s]", p_num)
p_num += 1
if char == byte("\n") {
fmt.Printf("\n[%s]", p_num)
p_num += 1
} else {
fmt.Printf(char)
}
}
}
http://play.golang.org/p/f4S3vQbglY
我收到了这个错误:
prog.go:21: cannot convert "\n" to type byte
prog.go:21: cannot convert "\n" (type string) to type byte
prog.go:21: invalid operation: char == "\n" (mismatched types byte and string)
prog.go:25: cannot use char (type byte) as type string in argument to fmt.Printf
[process exited with non-zero status]
如何将字符串转换为字节?
处理文字的一般做法是什么?读入,按字节或按行解析?
更新
我通过将缓冲区字节转换为字符串来解决问题,用正则表达式替换字符串。 (感谢@TomaszKłak提供的正则表达式帮助)
我把代码放在这里供参考。
package main
import (
"fmt"
"io/ioutil"
"regexp"
)
func main() {
b, err := ioutil.ReadFile("i_have_a_dream.txt")
if err != nil {
panic(err)
}
s := string(b)
r := regexp.MustCompile("(\r\n)+")
counter := 1
repl := func(match string) string {
p_num := counter
counter++
return fmt.Sprintf("%s [%d] ", match, p_num)
}
fmt.Println(r.ReplaceAllStringFunc(s, repl))
}
答案 0 :(得分:7)
使用"\n"
会将其视为数组,使用'\n'
将其视为单个字符。
答案 1 :(得分:0)
string
无法以有意义的方式转换为byte
。使用以下方法之一:
"a"
之类的字符串文字,请考虑使用'a'
之类byte
,可以将其转换为byte
。string
中取出myString[42]
,请使用string
之类的rune literal。strconv.Atoi()
。请注意,Go中习惯于编写可以处理Unicode字符的程序。解释如何做到这一点对于这个答案来说太过分了,但是有一些教程解释了要注意什么样的事情。