我正在从这种格式中分割字符串:
"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"
发生了什么事?
答案 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])
}
}