在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
strings标准库包主要涉及字符串的基本操作。 常见字符串的操作有:
由于string类型可以看成是一种特殊的slice类型,因此获取长度可以用内置的函数len;同时支持 切片 操作,因此,子串获取很容易。 说明:这里说的字符是rune类型,即一个UTF-8字符(Unicode代码点)。 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 是否存在某个字符或子串
示例代码:ContainsAny 函数说明
第二个参数 chars 中任意一个字符(Unicode Code Point)如果在第一个参数 s 中存在,则返回true。 上述三个函数的源码都是调用函数Index(子串出现的位置函数),然后和0比较返回true或false。如,contains函数:
字符或子串在字符串中出现的位置
示例:IndexFunc 的例子。
子串出现次数
(1)、特别说明一下的是当 sep 为空时,Count 的返回值是:utf8.RuneCountInString(s) + 1 (2)、Count 是计算子串在字符串中出现的无重叠的次数 字符串是否有某个前缀或后缀
golang语言中的rune类型
转载链接:http://ju.outofmemory.cn/entry/245284 Rune 是int32 的别名。用UTF-8 进行编码。这个类型在什么时候使用呢?例如需要遍历字符串中的字符。可以循环每个字节(仅在使用US ASCII 编码字符串时与字符等价,而它们在Go中不存在!)。因此为了获得实际的字符,需要使用rune类型。在UTF-8 世界的字符有时被称作runes。通常,当人们讨论字符时,多数是指8 位字符。UTF-8 字符可能会有32 位,称作rune。 例如 s:="Go编程" fmt.Println(len(s)) 输出结果应该是8 因为中文字符是用3个字节存的。 len(string(rune('编'))) 的结果是3 如果想要获得我们想要的情况的话,需要先转换为rune切片再使用内置的len函数 fmt.Println(len([]rune(s))) 结果就是 4 了。 所以用string存储 unicode 的话,如果有中文,按下标是访问不到的,因为你只能得到一个 byte 。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 字符串转换
------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- 比较
------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- 清理
代码示例:
------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- 拆合函数Fields
Fields 用一个或多个连续的空格分隔字符串 s,返回子字符串的数组(slice)。如果字符串 s 只包含空格,则返回空列表([]string的长度为0)。其中,空格的定义是 unicode.IsSpace,之前已经介绍过。 由于是用空格分隔,因此结果中不会含有空格或空子字符串。 FieldsFunc 用这样的Unicode代码点 c 进行分隔:满足 f(c) 返回 true。该函数返回[]string。如果字符串 s 中所有的代码点(unicode code points)都满足f(c)或者 s 是空,则 FieldsFunc 返回空slice。也就是说,我们可以通过实现一个回调函数来指定分隔字符串 s 的字符。 示例:
split这四个函数放在一起讲,是因为是通过同一个内部函数实现的。
它们都调用了 genSplit 函数。 这四个函数都是通过 sep 进行分割,返回[]string。如果 sep 为空,相当于分成一个个的 UTF-8 字符,如 Split("abc",""),得到的是[a b c]。 Split(s, sep) 和 SplitN(s, sep, -1) 等价;SplitAfter(s, sep) 和 SplitAfterN(s, sep, -1) 等价。 那么,Split 和 SplitAfter 有啥区别呢?通过这两句代码的结果就知道它们的区别了:
也就是说,Split 会将 s 中的 sep 去掉,而 SplitAfter 会保留 sep。 带 N 的方法可以通过最后一个参数 n 控制返回的结果中的 slice 中的元素个数,当 n < 0 时,返回所有的子字符串;当 n == 0 时,返回的结果是 nil;当 n > 0 时,表示返回的 slice 中最多只有 n 个元素,其中,最后一个元素不会分割,比如:
Join
将字符串数组(或slice)连接起来可以通过 Join 实现。 假如没有这个库函数,我们自己实现一个,我们会这么实现:
使用了 bytes 包的 Buffer 类型,避免大量的字符串连接操作(因为 Go 中字符串是不可变的)。 标准库的实现:
标准库的实现没有用 bytes 包,当然也不会简单的通过 + 号连接字符串。Go 中是不允许循环依赖的,标准库中很多时候会出现代码拷贝,而不是引入某个包。这里 Join 的实现方式挺好,我个人猜测,不直接使用 bytes 包,也是不想依赖 bytes 包(其实 bytes 中的实现也是 copy 方式)。 字符串重复次数
------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- 替换
------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- Replacer这是一个结构,没有导出任何字段(字段值小写),实例化通过
函数进行,其中不定参数 oldnew 是 old-new 对,即进行多个替换。
程序示例:
------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- Reader看到名字就能猜到,这是实现了 io 包中的接口。它实现了 io.Reader(Read 方法),io.ReaderAt(ReadAt 方法),io.Seeker(Seek 方法),io.WriterTo(WriteTo 方法),io.ByteReader(ReadByte 方法),io.ByteScanner(ReadByte 和 UnreadByte 方法),io.RuneReader(ReadRune 方法) 和 io.RuneScanner(ReadRune 和 UnreadRune 方法)。 Reader 结构如下:
可见 Reader 结构没有导出任何字段,而是提供一个实例化方法:
该方法接收一个字符串,返回的 Reader 实例就是从该参数字符串读数据。在后面学习了 bytes 包之后,可以知道 bytes.NewBufferString 有类似的功能,不过,如果只是为了读取,NewReader 会更高效。
其他方法不介绍了,都是之前接口的实现,有兴趣的可以看看源码实现比较简单易懂,大部分都是根据 i、prevRune 两个属性来控制。 参考网址:http://www.cnblogs.com/golove/p/3236300.html https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter02/02.1.html |
请发表评论