go语言字符串精解

学了go语言的都知道,这门语言的字符串操作和其他高级语言还有不小的差异,比如你直接len(s)和len([]rune(s))的结果可能会不一样,原因是go语言对assii和unicode编码的内置处理造成的,也别急,接下来我们将一起来了解go语言字符串的方方面面。

一.字符串的字符数量

在go语言中,定义一个字符串变量的规范格式是var s string := "hello, 世界",我们想要知道变量s的长度是多少,在go语言中提供了len方法可以获取:

var s string = "hello, 世界"
slen := len(s)
fmt.Printf("len is %d",slen)

在没有执行代码之前,你可能会认为这里打印出len is 9,但是其实不是这样的,你会得到len is 13。

那为什么会得到上面意味之外的结果呢?往下看....

在go语言中,len函数其实统计的是字符串的字节数量,而因为go语言是用utf8编码,utf8编码是3个字节一个汉字。因此对于上面的例子来说,s字符串可以分为"hello" ","  " " "世界",前面是7个字节,后面两个汉字是6个字节,加起来就是13个字节了。

知道了len统计字符的方式,那我们有没有办法可以统计到正确的或者说是我们想要的字符长度呢? 当然可以,go语言为我们提供了两种方式可以获取的一个字符串的长度

var s string = "Hello, 世界"
fmt.Println(utf8.RuneCountInString(s))  //方式1
//方式2
var runes []rune = []rune(s)
fmt.Println(len(runes))

以上两种方式中,第一种方式很明显,是统计utf8编码的字符数,因为go语言是utf8编码的,所以可以统计出正确的字符数字9。而第二种方式又是什么意思呢?往下看....

二、rune解惑

在go语言中,有一种以前高级语言中没有的类型rune,那这个类型到底是什么意思呢?

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune rune

这是go语言中对这个类型的解释,大概意思就是rune类型其实就是int32类型的另一个别名,它的意义就是用于从整型值中辨别字符值,说白了这个类型就是为了解决非英语的人类语言的字符处理而专门定义的类型。

如果对rune数组做reflect.typeOf(runes).String(),你会发现,打印出来的类型其实是[]int32。

通过以上阐述,那就很好理解为什么前面所说的len(runes)可以拿到正确的字符数量了。因为in32是4个字节,而汉字是3个字节,rune是计算unicode的code point的。

 

三、字符串操作

大家都知道,字符串是不可变的,想要把几个字符串连接起来,就需要多创建几个字符串对象。在java中,可以使用StringBuilder或者StringBuffer解决,在go语言中也提供了工具类解决这类问题。

bytes.Buffer

这个结构定义了一些方法来实现字符串之间的追加操作。比如WriteString方法Write(byte []byte)方法等。

对于字符串的其他类似分隔、查找等方法,可以在工具类strings中找到,这里就不多赘述了,因为通过方法名就可以很好理解使用方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章