strings.Split()似乎在[]处转义并继续前进(没有错误)

时间:2017-07-13 21:54:59

标签: go

我正在从这种格式中分割字符串:

"I[07-06|19:56:12.407] Added to precommit module=consensus vote="Vote{2:8FD0F8F1E2FA 1/00/2(Precommit) D7D7C52037F0 /E305561D4A6C.../}" precommits="VoteSet{H:1 R:0 T:2 +2/3:<nil> BA{4:__X_} map[]}"

像这样:

descripParse := strings.Split(string, "module")

当我使用如上所示的字符串时:

descripParse[1] == "=consensus vote="Vote{2:8FD0F8F1E2FA 1/00/2(Precommit) D7D7C52037F0 /E305561D4A6C.../}" precommits="VoteSet{H:1 R:0 T:2 +2/3:<nil> BA{4:__X_} map"

你会注意到[]之后的一切都消失了。这很糟糕,但更糟糕的是当[]出现在“模块”之前的行中时,如下所示:

"I[07-06|19:56:12.637] Added to lastPrecommits: VoteSet{H:2 R:0 T:2 +2/3:DAF77215090623803CB9715FFD98F58E24A37252:1:C10362D25921 BA{4:XXXX} map[]} module=consensus"

在这里,如果我查询descripParse[1],我的程序恐慌:

panic: runtime error: index out of range

因为分割点发生在[]之后,并且:

descripParse[0] == "I[07-06|19:56:12.637] Added to lastPrecommits: VoteSet{H:2 R:0 T:2 +2/3:DAF77215090623803CB9715FFD98F58E24A37252:1:C10362D25921 BA{4:XXXX} map"

发生了什么事?

1 个答案:

答案 0 :(得分:0)

因为字符串中有特殊字符,所以必须使用反引号(`)字符来定义字符串而不是双引号(")字符

有关此主题的更多信息,请参阅语言规范中的结帐字符串文字 https://golang.org/ref/spec#String_literals

以下是一段可用的演示代码: https://play.golang.org/p/Bf70i5u3MO

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := `I[07-06|19:56:12.407] Added to precommit                           module=consensus vote="Vote{2:8FD0F8F1E2FA 1/00/2(Precommit) D7D7C52037F0 /E305561D4A6C.../}" precommits="VoteSet{H:1 R:0 T:2 +2/3:<nil> BA{4:__X_} map[]}`
    fmt.Println(str)
    descripParse := strings.Split(str, "module")
    fmt.Println(len(descripParse))
    fmt.Println(descripParse)

    if descripParse[1] == `=consensus vote="Vote{2:8FD0F8F1E2FA 1/00/2(Precommit) D7D7C52037F0 /E305561D4A6C.../}" precommits="VoteSet{H:1 R:0 T:2 +2/3:<nil> BA{4:__X_} map[]}` {
        fmt.Println("WOOHOO!")
    } else {
        fmt.Println(descripParse[1])
    }
}