go array, slice, map

Array

//数组:数组是同一类元素的集合

package main

import "fmt"

func main() {
	//1 基本使用:定义
	//定义了一个大小为3的int类型数组
	//数组在定义阶段 大小和类型就已经确定了
	//var a [3] int //之定义,没有初始化
	//fmt.Println(a)

	//2 使用数组(从0开始)
	//var a [3] int
	//a[2]=100
	//fmt.Println(a)


	//3 定义并赋初值(同样是三种方式)
	//var a [3] int = [3] int {1,2,3}
	//var a = [3] int {1,2,3}
	//a := [3] int {1,2,3}

	//只给第二个位置设置为99
	//a := [3] int {2:99}
	//进阶版
	//a := [3] int {2:99,1:88}
	//fmt.Println(a)


	//4 数组的大小是类型的一部分
	//比如下面的两个不是一个类型
	//var a [2] int
	//var b [3] int

	//5 数组是值类型(当参数传递到函数中,修改并不会改变原来的值)
	//go语言中都是copy传递
	/*
	python 中都是引用传递,一切皆对象,当做参数传递,就是把地址传递过去了
	python 中比较特殊:可变类型,不可变类型
	 */

	//var a [3] int =[3]int{5,6,7}
	//fmt.Println(a)
	//test(a)
	//fmt.Println(a)  //数组是值类型,并不会修改

	//6 数组长度
	//var a [3] int =[3]int{5,6,7}
	//fmt.Println(len(a))

	//7 循环数组
	//方式一
	//var a [3] int =[3]int{5,6,7}
	//for i:=0;i<len(a);i++{
	//	fmt.Println(a[i])
	//}

	//方式二
	//在go语言中range是一个关键字
	//var a [3] int =[3]int{5,6,7}
	//for i,v:=range a{
	//	fmt.Println(i) //索引
	//	fmt.Println(v) //数组的值
	//}

	//函数如果返回两个值,必须用两个值来接收
	//range可以用一个值类接收

	//只取索引
	//for i:=range a{
	//	fmt.Println(i) //索引
	//}

	//只取值
	//for _,v:=range a{
	//	fmt.Println(v) //值
	//}


	//8 多维数组
	// 定义一个二维数组
	//var a [3][2]int
	//a[1][0] = 999

	//定义并初始化
	var a [3][2]int = [3][2]int{{1,2},{3,4},{5,6}}
	fmt.Println(a)


	//补充:类型的默认值
	//var a int
	//var b float32
	//var c string
	//var d bool
	//fmt.Println(a)  //0
	//fmt.Println(b)  //0
	//fmt.Println(c)  //空""
	//fmt.Println(d)  //false

}

func test(a [3] int){
	a[0]=999
	fmt.Println(a)
}


slice

//切片是由数组建立的一种方案,切片本省不拥有任何数据,只是对现有数组的引用
//切片底层依附于数组
package main

import "fmt"

func main() {
	//1创建切片(基于一个数组创建)
	//var a [9] int = [9] int {1,2,3,4,5,6,7,8,9}
	//2 基于数组 切出一部分成为切片
	// []int 中括号中没有东西就是切片
	//var b [] int
	// 没有-1 没有步长
	//b=a[0:3] //切片是一个前闭后开的区间
	//b=[:]
	//fmt.Println(b)

	//3 使用切片
	//fmt.Println(b[0])

	//4 切片的修改会影响 底层数组,数组的修改也就影响切片
	//var a [9] int = [9] int {1,2,3,4,5,6,7,8,9}
	//var b []int=a[0:3]
	//fmt.Println(a)
	//fmt.Println(b)
	//a[0]=999
	//fmt.Println(a)
	//fmt.Println(b)


	//5 切片的长度和容量
	//var a [9] int = [9] int {1,2,3,4,5,6,7,8,9}
	//var b []int=a[0:3]
	//
	//fmt.Println(len(b))  //长度
	////切片的容量是9 意思是 可以往里面追加值,追加成9个
	//fmt.Println(cap(b))  //容量

	//6 追加值
	//var a [9] int = [9] int {1,2,3,4,5,6,7,8,9}
	//var b []int=a[2:3]
	//b=append(b,1)
	//b=append(b,11,22,33,44,55)
	//fmt.Println(len(b))
	//fmt.Println(cap(b))
	//fmt.Println(b)
	//fmt.Println(a)
	//到了数组的尾部继续追加值,会怎样
	//b=append(b,999)
	//fmt.Println(len(b))
	// 总结1:当切片追加值,超过了切片容量会基于当前切片容量的最大值 然后翻倍
	//fmt.Println(cap(b))

	// 总结2:一旦超过了原数组,就会重新申请数组,把数据copy到新数组,切片和原数组就没多大关系了
	//fmt.Println(a)
	//fmt.Println(b)
	//a[8]=777
	//fmt.Println(a)
	//fmt.Println(b)

	//7 通过make创建切片(底层依附于数组)
	//var a [] int
	//// 切片零值是什么?nil类型:是所有引用类型的空值
	//fmt.Println(a)
	//if a==nil{
	//	fmt.Println("我是空的")
	//}

	//3是长度 4是容量
	//var a [] int=make([]int,3,4)
	//3是长度 3是容量
	//var a [] int=make([]int,3)
	//fmt.Println(a)
	//fmt.Println(len(a))
	//fmt.Println(cap(a))
	//
	//a=append(a,555)
	//fmt.Println(a)
	//fmt.Println(len(a))
	//fmt.Println(cap(a))

	//8 切片定义并赋初值
	//var a [] int = [] int{1,2,3}
	//fmt.Println(a)
	//fmt.Println(len(a))
	//fmt.Println(cap(a))

	//9 切片是引用类型,当参数传递 会修改原来的值
	//var a [] int = [] int{1,2,3}
	//fmt.Println(a)
	//test1(a)
	//fmt.Println(a)


	//10 多维切片
	//这只是初始化了第一层
	//var a [][]int=make([][]int,2,3)
	//fmt.Println(a)
	////会报错
	////a[0][0]=999
	//
	////如何做?
	////第二层初始化
	//a[0]=make([] int,2,3)
	//a[0][1]=999
	//fmt.Println(a)

	//一般定义并赋初值这个用的多
	//var a [][]int=[][]int{{1,2,3},{4,5,6},{7,8,9}}
	//fmt.Println(a)

	//11 切片的copy
	//var a []int = make([]int,3,4)
	//var b []int = make([]int,4,6)
	//a[0]=11
	//a[1]=22
	//a[2]=33
	//fmt.Println(a)
	//fmt.Println(b)
	//
	//copy(b,a)
	//fmt.Println(b)

	//12 切片越界
	//var a []int = make([]int,3,4)
	//a[0]=11
	//a[1]=22
	//a[2]=33
	//
	//fmt.Println(a[3])
	
	//13 切片循环
	//var a []int = make([]int,3,4)
	//for i:=0;i<len(a);i++ {
	//	fmt.Println(a[i])
	//}

	var a []int = make([]int,3,4)
	for i,v:=range a{
		fmt.Println(i)
		fmt.Println(v)
	}
}

func test1(a []int)  {
	a[0]=999
	fmt.Println(a)
}

map

/*
map:hash 字典 key,value存储
 */

package main

import "fmt"

func main() {
	//1 map 的定义和使用
	//map[key类型]value类型  key的类型必须可hash,数字,字符串
	//map的零值:nil 他是一个引用类型
	//var a map[int]string
	//fmt.Print(a)
	//if a==nil{
	//	fmt.Println("我是空的")
	//}


	// 2 定义了 没有初始化 使用
	//var a map[int]string
	//没有初始化报错
	//a[1]="alen"
	//初始化用make
	//var a map[int]string= make(map[int]string)
	//a[1]="alen"
	//fmt.Println(a)

	// 3 获取元素
	//var a map[int]string= make(map[int]string)
	//fmt.Println(a[0]) //取出value值的空值

	//4 统一的方案判断value值是否存在

	//a[0]可以返回两个值 一个是value值,另一个是true和false
	//var a map[int]string= make(map[int]string)
	//v,ok :=a[0]
	//fmt.Println(v)
	//fmt.Println(ok)

	//5 map 删除元素
	//var a map [int]int=make(map[int]int)
	//a[1]=11
	//a[2]=22
	//fmt.Println(a)
	////根据key删
	//delete(a,1)
	//fmt.Println(a)

	//6 map 长度
	//var a map [int]int=make(map[int]int)
	//a[1]=11
	//a[2]=22
	//fmt.Println(len(a))

	//7 map是引用类型
	//var a map [int]int=make(map[int]int)
	//a[1]=11
	//test2(a)
	//fmt.Println(a)

	//8 map相等性
	//var a map [string]string=make(map[string]string)
	//a["name"]="alen"
	//var b map [string]string=make(map[string]string)
	//b["name"]="alen"

	//不能这样判断,map只能nil比较
	//if a==nil {
	//
	//}


	//9 循环map
	var a map[string]string=map[string]string{"name":"lqz","age":"19","sex":"男"}
	//搞不了
	//for i:=0;i<len(a) ; i++ {
	//	fmt.Println(a[i])
	//
	//}

	//range循环
	for k,v:=range a{
		fmt.Println(k)
		fmt.Println(v)
	}

	// 10 map是无序的(python中字典从3.6以后有序了,3.6之前无序,底层如何实现的,看博客)



}

func test4(a map[int]int)  {
	a[1]=999
	fmt.Println(a)
}


}
func test2(map [int]int){
	a[1]=999
	fmt.Println(a)
}

Guess you like

Origin www.cnblogs.com/yafeng666/p/12757853.html