string rune 和 byte

range 作用于字符串,返回的k和v,v是rune类型,rune是uint32的等价类型。 其中的k不是rune数组的下标,而是byte数组的下标,所以i是不连续的
对于中文字符,rune类型就是其Unicode编码。



而使用s[i]获取字符串,则是获取的byte类型,是UTF-8编码的字节。
对于中文字符,s[i]只是UTF-8编码的一部分。



https://blog.csdn.net/u010971572/article/details/114496234

https://vimsky.com/examples/detail/golang-ex-bytes-Buffer-ReadRune-method.html



strings
strings包主要实现了利用简便的函数来操作UTF-8编码的字符串。



判断
Contains(s1 string,s2 string)bool s1中是否包含字符串s2



func ContainsRune(s string, r rune) bool判断字符串s是否包含utf-8码值r。



对于Index还有其几个扩展方法:
func IndexByte(s string, c byte) int字符c在s中第一次出现的位置,不存在则返回-1。



func IndexRune(s string, r rune) intutf-8码值r在s中第一次出现的位置,不存在则返回-1



https://blog.csdn.net/BangBrother/article/details/106833621
strings.NewReader创建一个从s读取数据的Reader



type Reader struct {
s string //对应的字符串
i int64 // 当前读取到的位置
prevRune int

}
// 读取器实了 io.Reader, io.ReaderAt, io.Seeker, io.WriterTo,
// io.ByteScanner, 和 io.RuneScanner 通过从字符串中读取
// Reader的零值类似于空字符串的读取器
type Reader struct {
s string // 对应的字符串
i int64 // 当前读取到的位置
prevRune int // prevRune索引; or < 0
}



二、相关方法
2.1 ReadByte
func (r *Reader) ReadByte() (byte, error)



ReadByte 从 r *Reader 中读出一个字节并返回
如果 r *Reader 中无可读数据,则返回一个错误
2.2 UnreadByte
func (r *Reader) UnreadByte() error



UnreadByte 撤消最后一次读出的字节
只有最后读出的字节可以被撤消
只要有内容被读出,就可以用 UnreadByte 撤消读出的一个字节
func (r *Reader) ReadByte() (byte, error)



2.3 ReadRune
方法说明:
func (r *Reader) ReadRune() (ch rune, size int, err error)



ReadRune 从 r *Reader 中读出一个 UTF8 编码的字符串并返回第一个参数 ch rune
同时返回该字符的 UTF8 编码长度,返回的第二个参数 size int,如果发生错误,第三个参数即错误 err error
如果 UTF8 序列无法解码出一个正确的 Unicode 字符,只读出 r *Reader 中的一个字节,并返回 ch = U+FFFD 字符,size = 1
2.4 UnreadRune
func (r *Reader) UnreadRune() error



UnreadRune 撤消最后一次读出的 Unicode 字符
如果最后一次执行的不是 ReadRune 操作,则返回一个错误
因此 UnreadRune 比 UnreadByte 更加严格



https://www.sdk.cn/details/eqZPyk7AgyJob5QxXw



https://www.golangtc.com/t/5914183eb09ecc0d590000b5



Category golang