#数据类型
一、基本数据类型
Go 语言内置七类基本数据类型
1.布尔类型
True False //不初始化默认为false
2.整型
byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
3.浮点型
float32
float64
4.复数
complex64
complex128
// real返回复数的实部, image返回复数的虚部
5.字符
rune //rune是uint类型的别名
6.字符串: string
赋值: a := "hello"
a := "hello world"
b := []byte(a)
c := []rune(a)
b和c的结果都是:[104 101 108 108 111 44 32 119 111 114 108 100]
7.错误类型: error
8.注意
Go内置两种字符类型:
一种是byte的字节类类型(byte是unit的别名),
另一种是表示unicode编码的字符rune. rune在go内部是int32类型的别名,占用4个字节.
二、复合数据类型
复合数据类型就是由其他类型组合而成的类型.
1.指针
*pointerType //指针类型使用*后面跟其指向的类型名
*T声明指针
**T 声明多级指针
*T 出现在"=" 左边表示指针声明, 右边表示取指针指向的值
结构体指针访问结构体字段仍然使用"."点操作符,Go语言没有"->"操作符
Go不支持指针的运算
函数中允许返回局部变量的地址
2.数组
[n]elementType //数组类型使用[n]后面跟数据元素类型来表示
var arr [2]int
数组初始化:
a := [3]int{1,2,3}
a := [...]int{1,2,3}
a := [3]int{1:1, 2:3} // 指定总长度,并通过索引值进行初始化,没有初始化元素时使用类型默认值
a := [...]int{1:1, 2:3} //不指定总长度,通过索引值进行初始化,数组长度由最后一个索引值确定,没有指定索引的元素被初始化为类型的零值
数组的特点:
1. 数组创建完长度就固定了,不可以再追加元素
2. 数组是值类型的,数组复制或作为函数参数都是值拷贝
数组相关操作:
1. 数组元素的访问
b := a[0]
for i, v := range a {
}
2. 数据的长度
len()
3.切片
Go 为切片维护三个元素一一指向底层数组的指针、切片的元素数量和底层数组的容量
[]elementType //切片类型使用[]后面跟切片元素类型来表示
切片的相关操作
1. 切片的创建
var array = [...]int{0,1,2,3,4,5,6,7}
s1 := array[0:4]
a := make([]int, 10) 或 a := make([]int, 10, 15)
2.切片支持的操作
内置函数len()返回切片长度
内置函数cap()返回切片底层数组容量
内置函数append()对切片追加元素
内置函数copy()用于复制一个切片
3.字符串和切片的相互转换
str := "hello,世界"
a := []byte(str) // 将字符串转换为[]byte类型切片
b := []rune(str) // 将字符串转换为[]rune类型切片
4.字典
Go语言内置的字典类型叫map.map的类型格式是: map[K]T, 其中K可以是任意可进行比较的类型,T是值类型.
map[keyType]valueType //map类型使用map[键类型]值类型来表示
字典的相关操作
1.map的创建
ma :=map[string]int{"a":1, "b":2}
make(map[K]T) 或者 make(map[K]T, len)
2.map支持的操作
map的单个键值访问方式是: mapName[key]
可以使用range遍历一个map类型变量,但是不保证每次迭代元素的顺序
for k, v := range mp {
fmt.Println("key=", k, "value=", v)
}
删除map中的某个键值,使用如下语法:delete(mapName, key)
可以使用内置的len()函数返回map中的键值对数量
注意:
Go内置的map不是并发安全的,并发安全的map可以使用标准包sync中的map。
不要直接修改map value内某个元素的值, 如果想修改map的某个键值,则必须整体复制。
type User struct {
name string
age int
}
ma := make(map[int]User)
andes := User{
name: "andes",
age: 18,
}
ma[1] = andes
ma[1].age = 19 //Error 不能通过map引用直接修改andes.age=19
andes.age = 19
ma[1] = andes //必须整体替换value
5.通道
chan valueType //通道使用chan后面跟通道元素类型来表示
6.结构和接口
struct {
feildType feildType
feildType feildType
...
} // 结构类型使用struct{} 将各个结构字段扩起来表示
struct类型字面量
struct {
FeildName FeildType
FeildName FeildType
FeildName FeildType
}
自定义struct类型
type TypeName struct {
FeildName FeildType
FeildName FeildType
FeildName FeildType
}
struct类型变量的初始化
type Persion struct {
Name string
Age int
}
type Student struct {
*Persion
Number int
}
// 按照类型声明顺序,逐个赋值
a := Persion{"Tom", 21} //不推荐这种初始化方式
// 推荐下面这种赋值方式
p := &Persion {
Name: "tata",
Age: 12
}
s := Strudent {
Persion: p,
Number: 110,
}