自学【golang】day-02

116 阅读2分钟

数据类型 - 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 的区别

  1. 都是用来申请内存的
  2. new很少用,一般给基本类型申请内存
  3. 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){
  
}