Reputation: 101
According to the answer at How to split a string and assign it to variables in Golang? splitting a string results in an array of strings where the separator is not present in any of the strings in the array. Is there a way to split strings such that the separator is on the last line of a given string?
e.x.
s := strings.split("Potato:Salad:Popcorn:Cheese", ":")
for _, element := range s {
fmt.Printf(element)
}
outputs:
Potato
Salad
Popcorn
Cheese
I wish to output the following instead:
Potato:
Salad:
Popcorn:
Cheese
I know I could theoretically append ":" to the end of each element except for the last, but I'm looking for a more general, elegant solution if possible.
Upvotes: 5
Views: 5443
Reputation: 1337
Try this to get the proper result.
package main
import (
"fmt"
"strings"
)
func main() {
str := "Potato:Salad:Popcorn:Cheese"
a := strings.SplitAfter(str, ":")
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
}
Upvotes: 0
Reputation: 3682
The answer above by daplho great and simple. Sometimes I just like to provide an alternative to remove the magic of a function
package main
import "fmt"
var s = "Potato:Salad:Popcorn:Cheese"
func main() {
a := split(s, ':')
fmt.Println(a)
}
func split(s string, sep rune) []string {
var a []string
var j int
for i, r := range s {
if r == sep {
a = append(a, s[j:i+1])
j = i + 1
}
}
a = append(a, s[j:])
return a
}
https://goplay.space/#h9sDd1gjjZw
As a side note, the standard lib version is better than the hasty one above
goos: darwin
goarch: amd64
BenchmarkSplit-4 5000000 339 ns/op
BenchmarkSplitAfter-4 10000000 143 ns/op
So go with that lol
Upvotes: 1
Reputation: 1135
You are looking for SplitAfter.
s := strings.SplitAfter("Potato:Salad:Popcorn:Cheese", ":")
for _, element := range s {
fmt.Println(element)
}
// Potato:
// Salad:
// Popcorn:
// Cheese
Upvotes: 14