Go中的文本处理 - 如何将字符串转换为字节?

时间:2015-01-11 08:34:26

标签: go

我正在写一段小段落来编号:

  1. 以[1] ......,[2] ....
  2. 的形式将段落编号放在每个段落的前面
  3. 应排除文章标题。
  4. 这是我的计划:

    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))
    }
    

2 个答案:

答案 0 :(得分:7)

使用"\n"会将其视为数组,使用'\n'将其视为单个字符。

答案 1 :(得分:0)

string无法以有意义的方式转换为byte。使用以下方法之一:

  • 如果您有"a"之类的字符串文字,请考虑使用'a'之类byte,可以将其转换为byte
  • 如果您想从string中取出myString[42],请使用string之类的rune literal
  • 如果您想将{{1}}的内容解释为(十进制)数字,请使用index expressionstrconv.Atoi()

请注意,Go中习惯于编写可以处理Unicode字符的程序。解释如何做到这一点对于这个答案来说太过分了,但是有一些教程解释了要注意什么样的事情。