Just F.Y.I.,
I often use strings.TrimFunc
, but I have found that strings.Map()
detects invisible chars better than strings.TrimFunc
.
strings.TrimFunc
can not detect if the input chars are "Douglas\u200b" + "bar"
. The following example fails if followed by "bar". The result becomes 13
rather than 10
.
func ExampleTrimFunc() {
invisibleChars := "Douglas\u200b" + "bar"
invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {
return !unicode.IsGraphic(r)
})
fmt.Println(invisibleChars)
fmt.Println(len(invisibleChars))
normal := "Douglasbar"
fmt.Println(normal)
fmt.Println(len(normal))
// Output:
// Douglasbar
// 10
// Douglasbar
// 10
}
However, using strings.Map()
as follows is successful.
func ExampleTrimFunc() {
invisibleChars := "Douglas\u200b" + "bar"
- invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {
- return !unicode.IsGraphic(r)
- })
+ invisibleChars = strings.Map(func(r rune) rune {
+ if unicode.IsGraphic(r) {
+ return r
+ }
+ return -1
+ }, invisibleChars)
fmt.Println(invisibleChars)
fmt.Println(len(invisibleChars))
normal := "Douglasbar"
fmt.Println(normal)
fmt.Println(len(normal))
// Output:
// Douglasbar
// 10
// Douglasbar
// 10
}