让我们一起Go(七)

前言:

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

 

一 不可变的字符串

在上一篇中,我们在最开始的时候提到过这个特性,不过不小心后来给忘记说了,对此非常抱歉(= =||),所以就今天补上了。还是用例子来说明,比较容易,请看下面:

 

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

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

 

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

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

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

 

二 字符串的遍历操作

 在Go语言中,要遍历一个字符串,访问每个字符方法与其他语言类似,当然是使用for循环了,关于for循环也与其它语言类似,所以以后就不单独介绍了,这里直接使用学习for循环:

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

看到这里,马上可以想到解决方法了,把字符串里面的byte数组转成rune数组就可以了,是的,看下面:

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

 

三 字符串的拼接

 在Go语言中,一般的字符串拼接直接用+号就可以了:

但是如果需要提高性能,可以导入bytes包如像下面这样:

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

posted @ 2013-01-24 22:50 Sirk 阅读(...) 评论(...) 编辑 收藏