Go 语言数据类型


普通赋值
var 变量名称 变量类型 = 值
var num int = 1
平行赋值
var num1,num2 int = 1, 2
多行赋值
var (
num1 int = 1
num2 int = 2
)
整数类型 命名 宽度
Go 整数类型 共有10个 其 计算架构相关 整数类型有两个
有符号 整数类型 int
无符号 整数类型 uint
不同 架构 计算机 宽度(存储某个类型的值所需要的空间) 不一样  空间的单位 是bit也可以是字节byte
这两个计算架构相关的整数类型之外 还有8个 显式表达自身宽度的整数类型
整数类型值的表示法
8进制为变量num赋值 num = 039 // 用 0 作为前缀以表明这是8进制表示法
16进制为变量num赋值 num = 0x39

浮点数类型

浮点数类型 两个 float32/float64 浮点数类型的值 由整数部分 小数点 . 和 小数部分组成
另 一种表示方法 是在其中加入指数部分 指数部分由 E 或 e 及带正负号的10进制整数表示 3.9E-2 浮点数0.039
E+1 浮点数39
浮点数类型值 可以被简化 比如39.0可以被简化为39 0.039可以被简化为.039 Go 浮点数的相关部分只能由10进制表示法表示

复数类型

两个 complex64和complex128
complex64类型的值 由两个float32类型的值分别表示复数的实数部分和虚数部分
complex128类型的值 由两个float64类型的值表示复数的实数部分和虚数部分
负数类型的值 由浮点数表示的实数部分 加号 + 浮点数表示的虚数部分以及小写字母 i 组成 3.9E+1 + 9.99E-2i

byte与rune

byte与rune都属于别名类型 byte是uint8 别名类型 而rune是int32 别名类型
rune 类型值即可表示一个Unicode字符 一个Unicode代码点通常由 U+ 和一个以十六进制表示法 表示的整数表示 英文字母'A'的Unicode代码点为"U+0041”
rune 类型的值需要由单引号 ' 包裹 不过 还可以用另外几种方式表示
在rune类型值的表示中 支持几种特殊的字符序列 转义符

字符串类型

原生表示法    用反引号 ` 把字符序列包起来
解释型表示法  用双引号 " 包裹字符序列
var str1 string = `str`
var str1 string = “str”
区别 前者表示 所见即所得的(除了回车符)  后者所表示的值中转义符会起作用
字符串值 不可变的 创建了 此类型的值 就不可能再对它本身做任何修改

数组类型

数组是 容纳 若干 相同类型的元素 的容器 长度是固定 type MyNumbers [3]int
类型声明 由关键字 type 类型名称 类型字面量 组成为数组类型 [3]int声明一个别名类型 把 MyNumbers 当作数组类型[3]int来使用
把该类型的 类型字面量 写在最左边 用花括号包裹该值 包含的若干元素 各元素之间以(英文半角)逗号分割  [3]int{1,2,3}
把 数组字面量赋给 名为numbers的变量 var numbers = [3]int{1,2,3}
变量声明语句 在声明变量的同时为 变量赋值

另一种方式
在其中的类型字面量中省略代表其长度的数组 var numbers = [...]int{1,2,3}
访问该变量中元素numbers[1]
修改数组 元素值 numbers[1] = 4
获取数组长度 var length = len(numbers)
数组没有赋值 默认值为 [length]type{0,0,0…}

切片类型

切片 slice 若干相同类型元素的容器
切片类型的长度 不确定
切片值 会将数组作为其底层数据结构 表示切片类型的字面量  []int 或 []string
切片类型的声明 type MySlice []int
切片值的表示 []int{1,2,3}
操作数组值的方法 适用于切片值  实施切片操作的方式 是切片表达式
var number3 = [5]int{1,2,3,4,5}
var slice1 = numbers3[1:4]
切片表达式numbers3[1:4] 结果为[]int{2,3,4} 被切下的部分 不包含元素上界索引指向的元素
slice1 切片值的底层数组 是 number3 值
在切片值上实施切片操作  var slice2 = slice1[1:3]

属性 长度 切片值  数组值  容量

数组的容量 等于其长度
切片值的容量 为它的第一个元素值在其底层数组中的索引值 与 该数组长度的差值的绝对值 可以使用cap()内建函数获取数组 切片 通道类型的值的容量
var capacity2 int = cap(slice2)
切片类型属 引用类型  零值 为nil 即空值 只声明 切片类型而不为它赋值  默认值 nil
可以在方括号中放入第三个正整数  numbers3[1:4:4]
第三个正整数为容量上界索引
可以把作为结果的切片值的容量设置的更小 限制 通过 切片值对其底层数组中的更多元素的访问 numbers3和slice的赋值语句
var numbers3 = [5]int{1,2,3,4,5}
var slice1 = numbers3[1:4]
变量slice1的值是[]int{2,3,4} 可以通过如下操作将其长度延展与其容量相同 slice1 = slice1[:cap(slice1)]
通过此操作 变量slice1的值变为了[]int{2,3,4,5} 且其长度和容量均为4
现在number3的值中的索引值在(1,5)范围内的元素都被体现在了slice1的值中
这是以number3的值是slice1的值的底层数组为前提的 通过切片访问其底层数组中对应索引值更大的更多元素
编写的函数返回了这样一个切片值 那么得到它的程序很可能会通过这种技巧访问到本不应该暴露给它的元素
在切片中加入了第三个索引(即容量上限索引) var slice1 = numbers3[1:4:4] 将无法通过slice1访问到number3的值中的第五个元素
虽然切片值在上述方面受到了其容量的限制
内建函数 append 对切片值进行扩展并返回一个新的切片值  slice1 = append(slice1, 6, 7)
slice1的值变为了[]int{2,3,4,6,7} 一旦扩展操作超出了被操作的切片值的容量 该切片的底层数组就会被替换
最后一种操作切片的方式是 复制 该操作的实施方法是调用copy函数 该函数接收两个类型相同的切片值作为参数
并把第二个参数值中的元素复制到第一个参数值中的相应位置(索引值相同)上 这里有两点需要注意
这种复制遵循最小复制原则 即 被复制的元素的个数总是等于长度较短的那个参值的长度
与append函数不同 copy函数会直接对其第一个参数值进行修改
var slice4 = []int{0,0,0,0,0,0}
copy(slice4, slice1)
slice4会变成[]int{2,3,4,6,7,0,0}

字典类型

Go语言 字典Map类型 是哈希表的实现 字典类型的字面量 map[K]T
K 为键的类型 T 代表元素(值)的类型 描述一个 键类型为int  值类型为string的字典类型 map[int]string
字典的键类型必须是可比较的 否则引起错误 即键不能是切片 字典 函数类型
字典值的字面量表示法实际上与数组的切片的字面量表示法很相似
最左边仍然是类型字面量 右边紧挨着由花括号包裹且有英文逗号分隔的键值对
每个键值对的键和值之间由冒号分隔 map[int]string为例  值的字面量可以是这样的  map[int]string{1:"a",2:"b"m,3:"c"}
把这个值赋给 变量 mm := map[int]string{1:"a",2:"b",3:"c"}
用索引表达式取出字典中的值  b := mm[2]
用索引表达式赋值 mm[2] = b + "2"
mm中键为2的值变为了"b2"
向字典中添加一个键值对 mm[4] = ""
对于字典值来说 如果指定键没有对应的值则默认为该类型的空值 所以mm[5]会返回一个""  就不知道mm[5]到底是""还是mm[5]没有这个值
go提供了 写法 e, ok := mm[5] 针对字典的索引表达式 有两个 结果 第二个求值结果是bool类型的 用于表明字典值中是否存在指定的键值对
从字典中删除键值对 调用内建函数 delete(mm, 4)
无论mm中是否存在 以4为键的键值对 delete都删除  字典类型属于引用类型 零值即为nil

通道类型

通道 Channel 是Go语言 用于在不同 Goroutine 间传递类型化的数据  且是并发安全的 前几种数据类型都不是并发安全的
Goroutine 是承载 被并发执行的代码块的载体  由Go语言的运行时系统调度 依托操作系统线程(又称内核线程) 并发 执行其中的代码块
通道类型的表示方法 由两部分组成 chan T
左边是 通道类型的关键字 chan
右边是 可变的部分 代表该通道类型允许传递的数据的类型(或称通道的元素类型)
无法表示通道类型的值
无法用字面量来为通道类型的变量赋值
只能通过调用内建函数make达到目的
make接受两个参数 第一个参数是代表将被初始化的值的类型的字面量(例  chan int)  第二个参数则是值的长度
make(chan int, 5)//初始化一个长度为5且元素类型为int的通道值  
make函数 被用来初始化切片类型或字典类型的值
存在通道值中的数据是先进先出
声明通道类型的变量 并为其赋值 ch1 := make(chan string, 5)
使用接受操作符 <- 向通道值发送数据 也可以从通道值接收数据
向通道ch1 发送字符串"value1" 应该这样  ch1 <- “value1"
从ch1 接收字符串  <- ch1
把接受到字符串赋给一个变量  value := <- ch1
针对通道值的接受操作也可以有第二个结果值 value, ok := <- ch1
ok 值 bool类型 代表通道值的状态
true 代表通道值有效
false 代表通道值已无效(或称已关闭)
如果在接受操作进行之前或过程中通道值被关闭了 则接收操作会立即结束并返回一个该通道值的元素类型的零值
通过函数close来关闭通道 close(ch1)
对通道值的重复关闭会引发运行时异常 会使程序崩溃
在通道值有效的前提下 针对它的发送操作会在通道值已满(其中缓存的数据的个数已等于它的长度)时被阻塞
而向一个已被关闭的通道值发送数据会引发运行时异常
针对有效通道值的接收操作会在它已经为空时被阻塞 通道类型属于引用类型 零值为nil