学习目标
掌握常见数据类型的使用
布尔类型
var v1 bool //默认值为false
v1 = true
v2 := (1 == 2) // v2也会被推导为bool类型
数值类型
整型:
int8、byte、int16、int、uint、uintptr等。
类型 | 长度(字节) | 取值范围 |
int8 | 1 | -128 ~ 127 |
uint8(即byte) | 1 | 0 ~ 255 |
int16 | 2 | -32 768 ~ 32 767 |
uint16 | 2 | 0 ~ 65 535 |
int32 | 4 | -2 147 483 648 ~ 2 147 483 647 |
uint32 | 4 | 0 ~ 4 294 967 295 |
int64 | 8 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
uint64 | 8 | 0 ~ 18 446 744 073 709 551 615 |
int | 平台相关 | 平台相关 |
uint | 平台相关 | 平台相关 |
uintptr | 同指针 | 在32位平台下为4字节,64位平台下为8字节 |
int和int32在Go语言里被认为是两种不同的类型,编译器也不会帮你自动 做类型转换
支持的位运算符:
运算 | 含义 | 样例 |
x << y | 左移 | 124 << 2 // 结果为496 |
x >> y | 右移 | 124 >> 2 // 结果为31 |
x ^ y | 异或 | 124 ^ 2 // 结果为126 |
x & y | 与 | 124 & 2 // 结果为0 |
x|y | 或 | 124|2 // 结果为126 |
^x | 取反 | ^2 // 结果为3 |
浮点类型:
float32、float64。
不能直接用==来判断两个浮点数是否相等
可以这样判断浮点型的大小:
import "math"
// p为用户自定义的比较精度,比如0.00001
func IsEqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}
复数类型:
complex64、complex128。
复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示 虚部(imag)。如果了解了数学上的复数是怎么回事,那么Go语言的复数就非常容易理解了。
- 复数表示
复数表示的示例如下:
var value1 complex64 // 由2个float32构成的复数类型
value1 = 3.2 + 12i
value2 := 3.2 + 12i // value2是complex128类型
value3 := complex(3.2, 12) // value3结果同 value2
- 实部与虚部
对于一个复数z = complex(x, y),就可以通过Go语言内置函数real(z)获得该复数的实 部,也就是x,通过imag(z)获得该复数的虚部,也就是y。
go语言不支持隐式转换(对比Java的隐式转换)
**字符串:**string。
var str string // 声明一个字符串变量 ,默认值为""
切片和数组
数组声明:
//数组定义
var a[3]int //声明并初始化默认值为0
a[0] = 1 //给第一个数赋值为1
b := [3]int{1,2,3} //声明同时初始化
c := [2][2]int{1, 2}, {3, 43} //多维数组初始化
d := [...]int{1,2,3,4,5}//自动匹配长度
数组遍历:
arr3 := [...]int{1, 3, 4, 5}
for i := 0; i < len(arr3); i++ {
t.Log(arr3[i])
}
//i 是索引,不使用索引用_代替
for i, e := range arr3 {
t.Log(e,i)
}
数组的截取:
a[开始索引(包含),结束索引(不包含)]
a := [...]int{1, 2, 3, 4, 5}
a[1:2] //结果: 2
a[1:3] //结果: 2,3
a[1:Len(a)] //结果: 2,3,4,5
a[1:] //结果: 2,3,4,5
a[:3] //结果: 1,2,3
切片
类似于Java中的集合List
切片声明:
//切片定义
var s0 [] int //初始长度为0
s0 = append(s0,1)//填充数据
s := []int{}
s1 := []int{1,2,3}
/*
格式: type,len,cap
其中len个元素会被初始化为默认零值,未初始化元素不可以访问,既,索引为0,1,2的值初始化为0可以访问,3,4不可以
访问
cap按2倍增长(类似于Java中list长度的增长因子)
*/
s2 := make([]int,3,5)/
map
map的声明:
var 变量名 map[key类型] value类型
m := map[string]int{"one": 1, "two": 2, "three": 3}
m1 :=map[string]int{}
m1["one"]=1//向容器中存入数据
m2 :=make(map[string]int, 100 )//设置容量
//判断值是否存在
if v, ok := m1["one"]; ok {
//值存在
}
注意:
当key不存在时:会输出默认值
当key对应的值不存在时:也会返回默认值
map的遍历:
m1 := map[int]int{1: 1, 2: 4, 3: 9}
//a是key b是value
for a, b := range m1 {
t.Log(a, b)
}
//k是key
for k := range m1 {
t.Log(k)
}