2017-05-19 70 views

回答

4

您可以使用strings.IndexByte()strings.IndexRune()獲得結腸':'的位置(字節指數),那麼只需slicestring值:

message := "Rob: Hello everyone!" 
user := message[:strings.IndexByte(message, ':')] 
fmt.Println(user) 

輸出(嘗試在Go Playground):

Rob 

如果您不確定冒號是否在string中,則必須在繼續對string進行切片之前檢查索引,否則你會遇到運行時恐慌。這是你如何做到的:

message := "Rob: Hello everyone!" 
if idx := strings.IndexByte(message, ':'); idx >= 0 { 
    user := message[:idx] 
    fmt.Println(user) 
} else { 
    fmt.Println("Invalid string") 
} 

輸出是一樣的。

更改消息是無效的:

message := "Rob Hello everyone!" 

輸出這個時間(試它的Go Playground):

Invalid string 

另一個方便的解決方案是使用strings.Split()

message := "Rob: Hello everyone!" 

parts := strings.Split(message, ":") 
fmt.Printf("%q\n", parts) 

if len(parts) > 1 { 
    fmt.Println("User:", parts[0]) 
} 

輸出(在Go Playground上試用):

["Rob" " Hello everyone!"] 
User: Rob 

如果有在輸入stringstrings.Split()返回包含單個string值作爲輸入的字符串的切片沒有冒號(上面的代碼不會在這種情況下打印出任何東西作爲長度將1)。

1

strings.Indexstrings.IndexRune,這取決於您是否要使用unicode作爲分隔符,會爲您提供所需字符的索引。

或者,您可以使用strings.Split並只抓住返回的第一個字符串。

實施例:user := strings.Split(message, ":")[0]

https://play.golang.org/p/I1P1Liz1F6

值得注意的是,這不會驚慌,如果分隔符不在原始字符串,但user變量將被設置到原來的字符串的全部代替。