定义一个切片,然后让切片去引用一个已经创建好的数组.基本语法如下:
索引1:切片引用的起始元素位
例程如下:
在方法一中,可以用arr数组名来操控数组中的元素,也可以通过slice切片来操控数组中的元素.切片是直接引用数组,数组是事先存在的,程序员是可见的.
通过 make 来创建切片,基本语法如下:
make函数第三个参数cap即容量是可选的,如果一定要自己注明的话,要注意保证cap≥len.
用该方法可以 指定切片的大小(len)和容量(cap)
由于未赋值系统默认将元素值置为0,即:
数值类型数组:?默认值为 0
字符串数组:? ? ? ?默认值为 ""
bool数组:? ? ? ? ? ?默认值为 false
在方法二中,通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素.
定义一个切片,直接就指定具体数组,使用原理类似于make的方式.
Go语言标准库中提供了sort包对整型,浮点型,字符串型切片进行排序,检查一个切片是否排好序,使用二分法搜索函数在一个有序切片中搜索一个元素等功能.
关于sort包内的函数说明与使用,请查看
今天这一节简单讲几个sort包中常用的函数
在Go语言中,对字符串的排序都是按照字节排序,也就是说在对字符串排序时是区分大小写的.
二分搜索算法
Go语言中提供了一个使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比较㏒?n个元素,其中n为切片中元素的总数.
sort.Search(size,fn)函数接受两个参数:所处理的切片的长度和一个将目标元素与有序切片的元素相比较的函数,该函数是一个闭包,如果该有序切片是升序排列,那么在判断时使用 有序切片的元素 = 目标元素.该函数返回一个int值,表示与目标元素相同的切片元素的索引.
在切片中查找出某个与目标字符串相同的元素索引
操作字符串离不开字符串的拼接,但是Go中string是只读类型,大量字符串的拼接会造成性能问题.
拼接字符串,无外乎四种方式,采用"+","fmt.Sprintf()","bytes.Buffer","strings.Builder"
上面我们创建10万字符串拼接的测试,可以发现"bytes.Buffer","strings.Builder"的性能最好,约是"+"的1000倍级别.
这是由于string是不可修改的,所以在使用"+"进行拼接字符串,每次都会产生申请空间,拼接,复制等操作,数据量大的情况下非常消耗资源和性能.而采用Buffer等方式,都是预先计算拼接字符串数组的总长度(如果可以知道长度),申请空间,底层是slice数组,可以以append的形式向后进行追加.最后在转换为字符串.这申请了不断申请空间的操作,也减少了空间的使用和拷贝的次数,自然性能也高不少.
bytes.buffer是一个缓冲byte类型的缓冲器存放着都是byte
是一个变长的 buffer,具有 Read 和Write 方法. Buffer 的 零值 是一个 空的 buffer,但是可以使用,底层就是一个 []byte, 字节切片.
向Buffer中写数据,可以看出Buffer中有个Grow函数用于对切片进行扩容.
从Buffer中读取数据
strings.Builder的方法和bytes.Buffer的方法的命名几乎一致.
但实现并不一致,Builder的Write方法直接将字符拼接slice数组后.
其没有提供read方法,但提供了strings.Reader方式
Reader 结构:
Buffer:
Builder:
可以看出Buffer和Builder底层都是采用[]byte数组进行装载数据.
先来说说Buffer:
创建好Buffer是一个empty的,off 用于指向读写的尾部.
其String()方法就是将字节数组强转为string
Builder是如何实现的.
Builder采用append的方式向字节数组后添加字符串.
其次String()方法与Buffer的string方法也有明显区别.Buffer的string是一种强转,我们知道在强转的时候是需要进行申请空间,并拷贝的.而Builder只是指针的转换.
这里我们解析一下 *(*string)(unsafe.Pointer(b.buf)) 这个语句的意思.
先来了解下unsafe.Pointer 的用法.
也就是说,unsafe.Pointer 可以转换为任意类型,那么意味着,通过unsafe.Pointer媒介,程序绕过类型系统,进行地址转换而不是拷贝.
即*A = Pointer = *B
就像上面例子一样,将字节数组转为unsafe.Pointer类型,再转为string类型,s和b中内容一样,修改b,s也变了,说明b和s是同一个地址.但是对s重新赋值后,意味着s的地址指向了"WORLD",它们所使用的内存空间不同了,所以s改变后,b并不会改变.
所以他们的区别就在于 bytes.Buffer 是重新申请了一块空间,存放生成的string变量, 而strings.Builder直接将底层的[]byte转换成了string类型返回了回来,去掉了申请空间的操作.
首先说一下go中的字符串类型:
下面介绍字符串的三种遍历方式,根据实际情况选择即可.
该遍历方式==缺点==:遍历是按照字节遍历,所以呢如果有中文等非英文字符,就会出现乱码,比如要遍历"abc北京"这个字符串,效果如下:
该方式是按照字符遍历的,所以不会出现乱码,如下:
运行结果:
由于下标的不确定性,所以引出了下面的遍历方式.
①. 可以先将字符串转成 []rune 切片
运行效果:
由此可见下标是按1递增的,没有产生跳跃现象.
要修改字符串,只能以原串为基础,创建一个新串.下面的图中是一个参考示例,提供了以原串为蓝本,创建新串的两种方法.
代码
输出
以上就是土嘎嘎小编为大家整理的go语言切割字符串相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!