数据类型
在Go中除了有最基础的整型、浮点型、布尔型、字符串以外,还拥有数组、切片、结构体、函数、map、通道(channel)等。其中基本类型和别的语言都是大同小异的
整型:
整型主要分成了两大类:按长度分为了:int8、int6、int32、int64对应的就是无符号整型:uint8、uint16、uint32、uint64
其中uint8就是我们熟悉的bytes类型,int16对应了C语言中的short类型,int64对应了C语言中的long类型
特殊整型:
ps:在使用int和uint的时候,不能假定它是32或者64位的整型,而是考虑int和uint可能在不同的平台上面的使用的差异
获取对象的长度用内建函数len() 函数返回的长度可以根据不同平台的字节长度进行变化。在实际的使用中切片或者map的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结果描述的时候,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和uint。
字符串:
Go语言中的字符串以原生数据类型出现,使用字符串就像是使用其它原生数据一样,Go语言里的字符串的内部实现使用utf8编码。字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ascii码的字符
字符串转义符:
\n:换行符(直接跳到下一行的同列位置)
\r:回车符(返回首行)
\t:制表符
\':单引号
\":双引号
\\:反斜杠
多行字符串:
Go语言中要定义一个多行字符串时,就必须使用反引号字符`内容`
字符串中常见的操作
byte和rune类型
组成每个字符串的元素叫做字符,可以通过遍历或者单个获取字符串元素获得字符。字符用单引号包裹起来
Go的字符有以下两种:
1、uint8类型,或者叫byte类型,代表了ascii码的一个字符
2、rune类型,代表一个utf-8字符
当你需要处理中文、日文或者其它的复合字符的时候,就会需要用到rune类型。rune类型实际上就是一个int32。
Go使用了特殊的rune类型来处理unicode,让基于unicode的文本处理更为方便,也可以使用byte类型进行默认字符串处理,性能和扩展性都有照顾
func traversalString() { s := "hello沙河" for i := 0; i < len(s); i++ { //byte fmt.Printf("%v(%c) ", s[i], s[i]) } fmt.Println() for _, r := range s { //rune fmt.Printf("%v(%c) ", r, r) } fmt.Println() }
输出:
104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³)
104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)
因为utf8编码下一个中问汉字是由3-4个字节组成的,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出第一行中的结果
字符串底层是一个byte数组,所以可以和[]byte类型互相转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。rune类型用来表示utf8字符,一个rune字符由一个或者多个byte组成。
修改字符串:
要是想修改字符串,首先需要将其转换成[]rune或者[]byte,完成后再转换为string。无论转换成哪种,都会重新分配内存,并复制字节数组。
func changeString() { s1 := "big" // 强制类型转换 byteS1 := []byte(s1) byteS1[0] = 'p' fmt.Println(string(byteS1)) s2 := "白萝卜" runeS2 := []rune(s2) runeS2[0] = '红' fmt.Println(string(runeS2)) }
类型转换:
Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
T(表达式)
其中T表示要转换的类型,表达式包括变量、复杂算子、函数返回值等等