让咱们一块儿Go(七)

前言:

  在上一篇中,咱们初步学习了下Go语言的字符串,这篇继续学习字符串的其它内容,咱们要不急不慌,慢慢学习Go语言,一口气是吃不成大胖子的。我也但愿喜欢这个系列的同窗就当这个是某些八卦新闻,不要有任何压力,等所有看完这个系列后,再继续深刻学习,这个只是新闻,能掌握多少就多少了,等所有看完了,或许你真的“变胖”了。那么咱们就继续学习吧~数组

 

一 不可变的字符串

在上一篇中,咱们在最开始的时候提到过这个特性,不过不当心后来给忘记说了,对此很是抱歉(= =||),因此就今天补上了。仍是用例子来讲明,比较容易,请看下面:函数

 

 这里的例子很好的解释了,字符串的不可变性,当你把13行注释去掉后,编译该文件就会报错,由于不容许修改字符串内容。不少初学者可能认为第10行不是改变字符串内容了吗?这种理解是错误的,第10行只是将变量cat指向了另外一个内存地址,原来字符串并没改变,你改变的只是变量的地址。性能

或许有人有疑问,第13行是否是单引号的问题?在Go语言中,单引号表示一个Unicode字符,这样是没问题的,不信,能够试试下面:学习

 

这里使用长度为5的字节数组来存放,而且在第一个位置放入‘c’字符,最后打印结果:编码

数组的第一个位置被填上了99,没错,这个99就对应了'c'字符的ascii码值。其他位置默认初始化为0。可是,当去掉第7行的注释后,当咱们把一个中文字符赋值给数组某个位置时,变会编译出错了。由于,咱们在Linux的vi下默认编码方式是UTF-8,因此对于中文的编码须要3个字节。而该byte类型的数组,每一个数组元素只有一个字节容量,因此放不下中文字符,那么若是咱们非要放中文字符,怎么办?看下面:spa

将byte数组换成rune类型的数组就好了。缘由就是rune是有32位的长度,足够放下3个字节表示的中文字符了。code

 

二 字符串的遍历操做

 在Go语言中,要遍历一个字符串,访问每一个字符方法与其余语言相似,固然是使用for循环了,关于for循环也与其它语言相似,因此之后就不单独介绍了,这里直接使用学习for循环:内存

若是像上面这样,你会发现最后打印出一堆乱码,其中代码中的%c表示格式化成字符,这样能够打印每一个字符,不过不幸的是,咱们失败了,若是将a赋值为所有英文,那么你又会发现能够打印出来。很明显,这里又是字符编码在搞怪了。由于字符串内部结构是一个byte的数组,这个在前一篇已经看到过了,因此默认调用len()函数,求得的字符串长度其实就是byte数组中元素个数,因而你取出来的每个元素,就是一个byte,若是是英文字符,那么不要紧,正好是一个byte,可是当是中文的时候,因为是UTF-8编码,因此,你的一个中文须要三个字节才能表示,现在你只取出了3个中的一个字节,可想而知,固然只能是一个乱码了。ci

看到这里,立刻能够想到解决方法了,把字符串里面的byte数组转成rune数组就能够了,是的,看下面:字符串

除了这个方法外,也可使用Go语言的迭代语法:

 

三 字符串的拼接

 在Go语言中,通常的字符串拼接直接用+号就能够了:

可是若是须要提升性能,能够导入bytes包如像下面这样:

 今天就到这里啦。。。。。