Go基础-基础数据类型
和其他的编程语言一样,Go语言中也有丰富的数据类型。有基本的整型、浮点型、布尔型、字符串类型,还有数组、切片、结构体、函数、map、通道(channel)等。
整形-int
按长度依次可分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64。其中,uint8就是我们熟知的byte型,int16对应C语言中的short(短整型),int64对应C语言中的long(长整型)。
各种整形
下面是不同的位数整型对应的取值范围:
| 类型 | 描述 | 取值范围 |
|---|---|---|
| uint8 | 无符号 8位整型 | 0 到 255 |
| uint16 | 无符号 16位整型 | 0 到 65535 |
| uint32 | 无符号 32位整型 | 0 到 4294967295 |
| uint64 | 无符号 64位整型 | 0 到 18446744073709551615 |
| int8 | 有符号 8位整型 | -128 到 127 |
| int16 | 有符号 16位整型 | -32768 到 32767 |
| int32 | 有符号 32位整型 | -2147483648 到 2147483647 |
| int64 | 有符号 64位整型 | -9223372036854775808 到 9223372036854775807 |
可变长度整形
对于经常使用的 int,uint 和 uintptr 这三个没有直接指定长度的整形类型。
我们需要注意的是:它们在不同的操作系统上的长度是不一样的,不能认为他们的长度是一致的。
| 类型 | 描述 |
|---|---|
| uint | 32位操作系统上就是uint32,64位操作系统上就是uint64 |
| int | 32位操作系统上就是int32,64位操作系统上就是int64 |
| uintptr | 无符号整型,用于存放一个指针 |
在实际使用中,slice、 map 或者是channel的的元素数量等都可以用int来表示。当有关于二进制传输、网络的编解码、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和 uint。
各种进制
在日常的使用中,十进制是最容易被我们理解的进制(逢十进一)。但是计算机的世界一般是二进制,偶尔会使用到八进制、十六进制。
v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。
v := 0o377,代表八进制的 377,相当于十进制的 255。
v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。
而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 表示 v 的值等于 123456。
我们可以借助fmt函数来将一个整数以不同进制形式展示。
// 十进制
var a int = 100
fmt.Printf("%d \n", a) // 100
fmt.Printf("%b \n", a) // 1100100 %b表示二进制
// 八进制 以0开头
var b int = 052
fmt.Printf("%o \n", b) // 52
// 十六进制 以0x开头
var c int = 0xff
fmt.Printf("%x \n", c) // ff
fmt.Printf("%X \n", c) // FF
浮点类型-float
Go语言中间有两种浮点类型:float32和float64,分别对应着单精度浮点和双精度浮点。
float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。
float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。
打印浮点数时,可以使用fmt包配合动词%f,代码如下:
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.E) // 2.718282
fmt.Printf("%.2f\n", math.Pi) // 3.14
}
布尔类型-bool
布尔类型在Go语言中表示的是真(true)和假(false)两个值,bool类型的默认值是false。
和其他语言不通的是:Go语言的布尔类型不可以从其他的整形转换过来,是有区别于其他类型的单独的类型。
package main
import "fmt"
func main() {
var right bool
if right {
fmt.Println("it is right")
} else {
fmt.Println("bool type default value is false")
}
}
字符串类型-string
Go 语言里的字符串的内部实现使用UTF-8编码, 字符串的值为双引号("")中的内容。
package main
func main() {
var name = "丰丞秀儿"
var title = "一个有趣的游戏设计师"
}
转义字符
转义字符一般在字符串中用于隔开一些特定的格式而增加的特定的字符类型。
比如说:”\n”表示新换一行。
Go 语言的字符串常见转义符包含引号、回车、换行、单双引号、制表符等,如下所示:
| 转义符号 | 说明 |
|---|---|
| \r | 回车符(返回行首) |
| \n | 换行符(直接跳到下一行的同列位置) |
| \t | 制表符 |
| ' | 单引号 |
| " | 双引号 |
| \ | 反斜杠 |
字符型
组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号('')包裹起来,如:
var name = "丰丞秀儿"
var title = "一个有趣的游戏设计师"
其中每一个元素都是一个字符,比如说:’丰’ ,’丞’ , ’秀’ , ’儿’。
而在Go语言中,字符类型分为两种,分别是:
| 字符类型 | 说明 |
|---|---|
| byte 类型 | 其实也是一个uint8类型,代表一个ASCII码字符 |
| rune类型 | 其实是一个int32类型,代表一个 UTF-8字符 |
当需要处理中文、日文、韩语等复合类型的字符时,则需要用到rune类型。Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便。
package main
import "fmt"
func main() {
s := "丰丞秀儿"
//byte
for i := 0; i < len(s); i++ {
fmt.Printf("%v(%c) ", s[i], s[i])
}
// 输出: 228(ä) 184(¸) 176(°) 228(ä) 184(¸) 158() 231(ç) 167(§) 128() 229(å) 132() 191(¿)
fmt.Println()
//rune
for _, r := range s {
fmt.Printf("%v(%c) ", r, r)
}
//输出:20016(丰) 19998(丞) 31168(秀) 20799(儿)
}
因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。
字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的,字符串是由byte字节组成,所以字符串的长度是byte字节的长度。
rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
字符串的修改
要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string,这种操作都会发生对象的复制,修改后的对象已经是另外一个内存地址的对象了。
package main
import "fmt"
func main() {
s1 := "golang"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'G'
fmt.Println(string(byteS1))
s2 := "丰丞秀儿"
runeS2 := []rune(s2)
runeS2[0] = '风'
fmt.Println(string(runeS2))
}
转载自:https://juejin.cn/post/7141775920788045861