Today I wanted to remove, from a string, the substring starting with a specified string.
For a line of code with a comment started with #, I wanted to remove everything starting at #, so the line “line with #comm#ent” should become “line with “.
The test for this is:
func TestRemoveFromStringAfter(t *testing.T) { tests := []struct { input, after, expected string }{ { input: "line with #comm#ent", after: "#", expected: "line with ", }, { input: "line to clean", after: "abc", expected: "line to clean", }, { input: "line to clean", after: "l", expected: "", }, { input: "", after: "", expected: "", }, { input: " ", after: "", expected: " ", }, } for i, test := range tests { result := RemoveFromStringAfter(test.input, test.after) if result != test.expected { t.Fatalf("Failed at test: %d", i) } } }
I tried to use TrimSuffix and TrimFunc from the strings package, but they weren’t getting me where I wanted. Then, all of a sudden, it stroke me: a string can be treated as a slice and a subslice is what I need. A subslice which ends right before the position of the suffix I give.
So I take the position of the suffix and extract a substring of the input string:
func RemoveFromStringAfter(input, after string) string { if after == "" { return input } if index := strings.Index(input, after); index > -1 { input = input[:index] } return input }