fmt.Printf("%qn", ts) // " 世界"
}
注:TrimSuffix只是去掉s字符串结尾的suffix字符串,只是去掉1次,而TrimRight是一直去掉s字符串右边的字符串,只要有响应的字符串就去掉,是一个多次的过程,这也是二者的本质区别.
------------------------------------------------------------
// Replace 返回 s 的副本,并将副本中的 old 字符串替换为 new 字符串
// 替换次数为 n 次,如果 n 为 -1,则全部替换
// 如果 old 为空,则在副本的每个字符之间都插入一个 new
func Replace(s, old, new string, n int) stringfunc main() {
s := "Hello 世界!"
s = strings.Replace(s, " ", ",", -1)
fmt.Println(s)
s = strings.Replace(s, "", "|", -1)
fmt.Println(s)
}
------------------------------------------------------------
// EqualFold 判断 s 和 t 是否相等。忽略大小写,同时它还会对特殊字符进行转换
// 比如将“ϕ”转换为“Φ”、将“DŽ”转换为“Dž”等,然后再进行比较
func EqualFold(s, t string) bool
func main() {
s1 := "Hello 世界! ϕ DŽ"
s2 := "hello 世界! Φ Dž"
b := strings.EqualFold(s1, s2)
fmt.Printf("%vn", b) // true
}
============================================================
// reader.go
------------------------------------------------------------
// Reader 结构通过读取字符串,实现了 io.Reader,io.ReaderAt,
// io.Seeker,io.WriterTo,io.ByteScanner,io.RuneScanner 接口
type Reader struct {
s string // 要读取的字符串
i int // 当前读取的索引位置,从 i 处开始读取数据
prevRune int // 读取的前一个字符的索引位置,小于 0 表示之前未读取字符
}// 通过字符串 s 创建 strings.Reader 对象
// 这个函数类似于 bytes.NewBufferString
// 但比 bytes.NewBufferString 更有效率,而且只读
func NewReader(s string) *Reader { return &Reader{s, 0, -1} }
------------------------------------------------------------
// Len 返回 r.i 之后的所有数据的字节长度
func (r *Reader) Len() intfunc main() {
s := "Hello 世界!"
// 创建 Reader
r := strings.NewReader(s)
// 获取字符串的编码长度
fmt.Println(r.Len()) // 13
}
------------------------------------------------------------
// Read 将 r.i 之后的所有数据写入到 b 中(如果 b 的容量足够大)
// 返回读取的字节数和读取过程中遇到的错误
// 如果无可读数据,则返回 io.EOF
func (r *Reader) Read(b []byte) (n int, err error)









