// TrimSpace returns a slice of the string s, with all leading
// and trailing white space removed, as defined by Unicode.
func TrimSpace(s string) string {
// Fast path for ASCII: look for the first ASCII non-space byte
start := 0
for ; start < len(s); start++ {
c := s[start]
if c >= utf8.RuneSelf {
// If we run into a non-ASCII byte, fall back to the
// slower unicode-aware method on the remaining bytes
return TrimFunc(s[start:], unicode.IsSpace)
}
if asciiSpace[c] == 0 {
break
}
}
// Now look for the first ASCII non-space byte from the end
stop := len(s)
for ; stop > start; stop-- {
c := s[stop-1]
if c >= utf8.RuneSelf {
return TrimFunc(s[start:stop], unicode.IsSpace)
}
if asciiSpace[c] == 0 {
break
}
}
// At this point s[start:stop] starts and ends with an ASCII
// non-space bytes, so we're done. Non-ASCII cases have already
// been handled above.
return s[start:stop]
}
strings.TrimSpace(s string)会返回一个string类型的slice,并将最前面和最后面的ASCII定义的空格去掉,中间的空格不会去掉,如果遇到了\0等其他字符会认为是非空格。
buf := make([]byte, 10)
buf[0] = ' '
buf[1] = ' '
buf[2] = 'b'
buf[3] = 'b'
buf[4] = ' '
buf[5] = ' '
buf[6] = 'b'
// buf[7] = ' '
// buf[8] = ' '
buf[9] = ' '
fmt.Println(buf)
fmt.Printf("%s ,%d\n", strings.TrimSpace(string(buf)), len(strings.TrimSpace(string(buf))))
输出结果是
[32 32 98 98 32 32 98 0 0 32]
bb b ,7
也就是说输出结果将前面的两个32和最后一个32去掉,结果长度为7。
如果将buf[9]注释掉
buf := make([]byte, 10)
buf[0] = ' '
buf[1] = ' '
buf[2] = 'b'
buf[3] = 'b'
buf[4] = ' '
buf[5] = ' '
buf[6] = 'b'
// buf[7] = ' '
// buf[8] = ' '
// buf[9] = ' '
fmt.Println(buf)
fmt.Printf("%s ,%d\n", strings.TrimSpace(string(buf)), len(strings.TrimSpace(string(buf))))
输出结果
[32 32 98 98 32 32 98 0 0 0]
bb b ,8
结果只将前面两个空格去掉了,最后一个32没去掉,所以长度为8