数据类型 - 02
数组
// 数组
// 数组长度是 数组类型的一部分
var a [3]bool // [true,false,false]
// 初始化
a = [3]bool{true,false,false}
// 根据数组长度自动推断数组长度
a = [...]bool{true,false,false}
a1 := [4]int{0: 1, 3: 3} // [1,0,0,3] 空位补0
// 遍历数组 -- 索引遍历
for i :=0; i<len(a1);i++{
fmt.Println(a1[i])
}
// 遍历数组 -- range
for _,v := range a1{
fmt.Printf("%d",v)
}
// 多维数组
var a11 [3][2]int
a11 = [3][2]int{
{1, 2},
{1, 2},
{1, 2},
}
for _, v1 := range a11 {
fmt.Println(v1)
for _, v2 := range v1 {
fmt.Println(v2)
}
}
切片
切片之间不能比较
// 切片是引用类型
// 自定义切片
var s []int //int 类型的切片
s==nil // true
s :=[]int{} //!=nil
//初始化
s = []int{1,2,3}
//长度 容量
len(s)
cap(s)
// 由数组得到切片
s1 := [...]int{1,3,5,7,9,11,13}
s2 := s1[0:4] // 左闭右开 [1 3 5 7]
s3 := s1[1:] // 切片的容量是切片第一个位置到数组最后一个位置
s4 := s1[:5]
s5 := s1[:]
make函数创造切片 分配内存
s1 := make([]int,5,10) // 长度为5 容量为10
s2 := make([]int,0) // !=nil
##### append为切片尾部添加元素
// 直接通过下标添加会超出索引
s1 := [...]int{1,3,5,7,9,11,13}
s2 := s1[0:4]
s2 = append(s2, 1, 23) // 1 3 5 7 1 23
指针
// & 取内存地址 * 根据内存地址取值
// 可以吧指针看作 一个 key value 内存地址为key 值为value key是唯一的
var a *int //空指针
var s = 123
p := &s //p 储存的是s的内存地址 p有自己的内存地址
new 分配内存
// 创建指针 少用
var a = new(int)
*a = 100
make 和 nev 的区别
- 都是用来申请内存的
- new很少用,一般给基本类型申请内存
- make 是用来给slice、map、chan 申请内存的,make返回对应的这三个类型的本身
map
// 数据类型为 引用类型
var m mavar m map[string]int
m["理想"] = 1
fmt.Println(m)p[string]int // 报错,没有初始化 没有内存空间
// 通过make 初始化
m := make(map[string]int, 10)
m["理想"] = 1
fmt.Println(m)
v,ok := m["asd"] // 一般用ok接收返回的布尔值 如果ok为false 那么 v = 0
遍历
m := make(map[string]int, 10)
for k,v :=range m{
}
删除
// 删除不存在的值 不做操作
delete(m,"理想")
函数 func
// func关键字 函数名(参数 参数类型,参数 参数类型)(返回值 返回值类型)
func sum(x int,y int)(ret int){
ret = x+y
return
}
// 讴歌返回值
func a() (int,int){
return 1,2
}
// 无参数 返回值
func a(){
}
// 无参数 有返回值
func a() int {
return 3
}
// 参数类型简写
func a(x,y int){
}
// 不定长参数
func a(x string,y ...int){
}