GO语言三

1 switch

package main

// 多条件匹配,用于替换多个if else

func main() {
	//1 switch基本使用
	//var a=10
	//switch a {
	//case 8:
	//	fmt.Println("8")
	//case 9:
	//	fmt.Println("9")
	//case 10:
	//	fmt.Println("10")
	//}

	//2 默认情况(Default Case)

	//var a=8
	//switch a {
	//case 8:
	//	fmt.Println("8")
	//case 9:
	//	fmt.Println("9")
	//case 10:
	//	fmt.Println("10")
	//default: //上面所有条件都不符合,执行我
	//	fmt.Println("我不知道")
	//}

	//3多表达式判断
	//var a=66
	//switch a {
	//case 7,8,9:
	//	fmt.Println("8")
	//case 10,11,12:
	//	fmt.Println("9")
	//case 13,14,15,16,17:
	//	fmt.Println("10")
	//default: //上面所有条件都不符合,执行我
	//	fmt.Println("我不知道")
	//}

	//4 无表达式
	// and 和 or    ----》 &&   ||
	//var a = 10
	//switch {
	//case a == 8:
	//	fmt.Println("8")
	//case a == 9:
	//	fmt.Println("9")
	//case a == 10 || a==11:
	//	fmt.Println("10")
	//default: //上面所有条件都不符合,执行我
	//	fmt.Println("我不知道")
	//}
	//5 Fallthrough
	//var a = 8
	//switch {
	//case a == 8:
	//	fmt.Println("8")
	//	fallthrough   //无条件执行下一个case中的代码
	//case a == 9:
	//	fmt.Println("9")
	//	fallthrough
	//case a == 10 :
	//	fmt.Println("10")
	//default: //上面所有条件都不符合,执行我
	//	fmt.Println("我不知道")
	//}
}

2 数组

package main

import "fmt"

//数组:数组是同一类型元素的集合,类似于python中的列表(列表可以放任意元素)

//python中列表,为什么能放任意类型的元素?
//	-python中一切皆对象,对象是一个引用(内存地址)
func main() {
	//1 数组的声明(数组有大小,放的数据类型),定义阶段长度固定了,以后不能改
	//定义了一个长度为3的int类型数组
	// int 默认值 是0
	// string 默认值是 ""
	// bool 类型默认值  false
	// 数组的默认值   跟它的数据是有关系的,数组存放类型的空值
	//var a [4]int
	//var a [5]string
	//fmt.Println(a)

	//1.1 定义并初始化
	//var a [3]int =[3]int{1,2,3}
	//var a =[3]int {1,2,3}
	// a:=[3]int{1,2,3}
	//var a [3]int=[3]int{1,2,3,4}  //错误
	//只想把第29个位置置为1 ,其它都是0
	//var a [30]int=[30]int{28:1,23:999}
	// 了解 (这不是可变长)
	//a :=[...]int{28:1,23:999}  //长度定下了29
	//a :=[...]int{2,3,4}  //长度定下了3
	//a :=[3]int{2,3,4}  //长度定下了3
	//1.2 使用
	//fmt.Println(a[2])
	//fmt.Println(a)
	//fmt.Println(a[3])   // 不能超长


	//2 数组是值类型(值类型,引用类型),当做函数传参,传到函数内部,修改数组,不会影响原来的
	// go中函数传参,都是copy传递

	// python中 可变类型和不可变类型(一切皆对象,都是引用)
	//python强行把 数字,字符串,元组做成不可变数据类型
	//1 数字,字符串,元组做成不可变数据类型,当做参数传参,在函数中修改不可变数据类型,不会改变原来的
	//2 其他的,在函数中修改,都会影响原来的
	// python是值传递还是引用传递?
	/*
	Python参数传递统一使用的是引用传递方式。
		因为Python对象分为可变对象(list,dict,set等)和不可变对象(number,string,tuple等),
		当传递的参数是可变对象的引用时,因为可变对象的值可以修改,
		因此可以通过修改参数值而修改原对象
		当传递的参数是不可变对象的引用时,虽然传递的是引用,参数变量和原变量都指向同一内存地址,
		但是不可变对象无法修改,所以参数的重新赋值不会影响原对象,
	 */
	//var a =[30000]int{2,4,6}
	////var b =[3]int{2,4,6}
	//fmt.Println(a)
	//test(a)
	//fmt.Println(a)

	//3 数组的长度  len()
	//var a =[30000]int{2,4,6}
	//fmt.Println(len(a))

	//4 循环数组(使用 range 迭代数组)
	//第一种方式
	//var a =[3]int{2,4,6}
	//for i:=0;i<len(a);i++{
	//	fmt.Println(a[i])
	//}
	//第二种通过range, range不是一个内置函数,它是一个关键字
	//i:=range a   i是索引 ,一个值来接收,就是索引
	//i,v:=range a  i是索引,v是具体的值,如果两个值来接收,就是索引和值
	//var a =[3]int{2,4,6}
	//for i:=range a{
	//	fmt.Println(i)
	//}
	//var a =[3]int{2,4,6}
	////for i,v:=range a{
	////	fmt.Println(i)
	////	fmt.Println(v)
	////}
	//for _,v:=range a{
	//	fmt.Println(v)
	//}
	//5 多维数组(数组套数组)

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


}

func test(x [30000]int)  {
	x[0]=999
	fmt.Println(x)

}



//数组大小是类型的一部分
	var a [3]int 
	var b [4]int
	b=a
	test4(b)


func test4(a [3]int)  {
	fmt.Println(a)
}

3 切片

package main

import "fmt"

//切片:切片是由数组建立的一种方便、灵活且功能强大的包装,
//   切片本身不拥有任何数据。它们只是对现有数组的引用
func main() {
	//1 创建一个切片
	//先创建一个 数组
	//var a [10]int=[10]int{1,2,3,4,5,6,7,8,9,10}
	//创建切片(基于上面的数组切出来,从第0个位置切到最后一个位置)
	//var b =a[:]
	//var b =a[5:]   //第5个位置切到最后
	//var b =a[5:9]  ////第5个位置切到第9个位置,前闭后开区间

	//中括号有东西,就是数组,没有东西就是切片
	//var b[]int =a[5:9]
	//fmt.Println(b)

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

	//3 切片的长度和容量
	//len() :长度,现在有多少值
	//cap() :容量,总共能放多少值
	//var a [10]int=[10]int{1,2,3,4,5,6,7,8,9,10}
	////var b[]int =a[5:9]
	////var b[]int =a[0:3]
	//var b[]int =a[2:3]
	//fmt.Println(len(b))
	//fmt.Println(cap(b))

	//4 使用 make 创建一个切片
	//切片空值是?nil类型(引用类型空值都是nil)
	//var a []int
	//fmt.Println(a)
	//if a==nil{
	//	fmt.Println("我是空的")
	//}
	//a[0]=100  //这样写,你觉得可以么?直接报错
	//fmt.Println(a)
	//make内置函数。第一个参数写类型,第二个参数是切片的长度,第三个参数是切片的容量
	//var a []int=make([]int,3,4)
	//var a []int=make([]int,3)   //长度是多少3,容量是3,容量如果不传,默认跟长度一样
	////a[0]=999
	////a[9]=100  //你觉得行么?不行!!!
	//a[2]=999    //中括号取,只能取到长度
	////a[3]=888   //报错!!!!
	//fmt.Println(a)
	//fmt.Println(len(a))
	//fmt.Println(cap(a))

	//切片如果基于数组切出来
	//var a [10]int=[10]int{1,2,3,4,5,6,7,8,9,10}
	//var b[]int =a[5:9]
	//b=append(b,777)
	//b=append(b,666)  //现在就不会依赖原来的数组了,现在再改变,不会影响原来的数组了
	//
	//b[0]=11111
	//fmt.Println(b)
	//fmt.Println(len(b))
	//fmt.Println(cap(b))
	//fmt.Println(a)

	//5 追加切片元素
	//var a []int=make([]int,4,5)
	////在最后追加一个元素 999
	//a=append(a,999)
	////会怎么样?不会报错,
	////追加的时候,一旦超过容量,会重写创建一个数组,让切片指向新的数组,新数组大小是原来切片容量的两倍
	//a=append(a,888)
	//a=append(a,888)
	//a=append(a,888)
	//a=append(a,888)
	//a=append(a,888)
	//
	//a=append(a,888)
	//fmt.Println(a)
	//fmt.Println(len(a))
	//fmt.Println(cap(a))
	//6 切片的函数传递(引用类型,传递,修改原来的)
	//var a []int=make([]int,4,5)
	//fmt.Println(a)
	//test2(a)    //copy传递
	//fmt.Println(a)

	//切片的内部结构
	//a=
	//{
	//	指针:0x111
	//	len:4
	//	cap:5
	//}

	//7 多维切片
	//var a []int=[]int{1,2,3,4,5}  //类似于数组初始化,切片初始化
	//fmt.Println(a)
	//fmt.Println(len(a))
	//fmt.Println(cap(a))


	//var a [][]int=make([][]int,3,4)
	//
	//var a [][]int=make([][]int,3,4)
	//这个值是什么?
	//fmt.Println(a[0])
	//a[0][1]=100
	//if a[0]==nil{
	//	fmt.Println("xxxx")
	//}


	//var a [][]int=[][]int{{1,2,3},{2,3},{4,5,5,6,7,8,9}}
	////fmt.Println(a)
	////fmt.Println(len(a[2]))
	////fmt.Println(cap(a[2]))
	//a[0][1]=999
	//fmt.Println(a)
	//8  切片copy
	//var a []int=make([]int,6,7)
	//var b []int =[]int{1,2,3,4,5}
	//fmt.Println(a)
	//fmt.Println(b)
	////把b的数据copy到a上
	//copy(a,b)
	//fmt.Println(a)
	//fmt.Println(b)
	//循环切片
	var b []int =[]int{1,2,3,4,5}
	for _,v:=range b{
		fmt.Println(v)
	}




}
func test2(a []int)  {
	a[0]=999
	a=append(a,888)
	fmt.Println(a)
	fmt.Println(cap(a))
}

4 maps

package main

import "fmt"

//maps--->hash --->字典
// key:value---->key必须可hash

// map 在定义时,key(数字和字符串)和value的类型固定了

func main() {
	//1 如何创建 map
	//map的类型  :map[key的类型]value的类型
	//var a map[int]string
	// map的空值是什么? nil  (引用类型的空值都是nil)
	//fmt.Println(a)
	//if a==nil{
	//	fmt.Println("我是空的")
	//}

	//定义并初始化(make完成)
	//var a map[int]string=make(map[int]string)
	//fmt.Println(a)
	//if a==nil{
	//	fmt.Println("我是空")
	//}
	//定义并初始化,直接赋值var a map[int]string=
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}   //数组初始化,切片初始化,很像
	//var a map[int]string= map[int]string{}   //不是nil类型
	//fmt.Println(a)
	//if a==nil{
	//	fmt.Println("我是空")
	//}

	//var a =make(map[int]string)
	//a :=make(map[int]string)
	//fmt.Println(a)



	//2 给 map 添加元素(有就是更新,没有就是新增)
	//
	////var a map[int]string  // 不能往里添加元素
	////a :=make(map[int]string)
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	////a[1]="lqz"   //往里添加元素
	//////a[1]=123   //类型不匹配
	////a[1]="egon"  // 更新
	//a[9]="xxx"
	//fmt.Println(a)

	//3 获取 map 中的元素
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	//var a map[int]int= map[int]int{1:1,2:0}
	//fmt.Println(a[1])

	//fmt.Println(a[9])  //取不到,会打印出value值的默认值(空值)
	//从字典中取值,其实会返回两个值,一个是true和false,一个是真正的值
	//如果用一个变量来接,就是值(可能为空,可以能有值),两个变量接,一个是值,一个是true和false
	//b:=a[9]
	//b,ok:=a[9]
	//b,ok:=a[1]
	//a[2]=0
	//b,ok:=a[2]
	//fmt.Println(a)
	//fmt.Println(b)
	//fmt.Println(ok)


	//4 删除 map 中的元素
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	//fmt.Println(a)
	////根据key删除值
	//delete(a,1)
	//fmt.Println(a)

	//5 获取 map 的长度(len())
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	//a[9]="999"
	//fmt.Println(len(a))
	//6 Map 是引用类型
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	//fmt.Println(a)
	//test3(a)
	//fmt.Println(a)
	//7 Map 的相等性
	//var a map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	//var b map[int]string= map[int]string{1:"lqz",2:"egon",3:"jason"}
	//if a==b{  //map不能通过等号来判断,自己写循环,一个个取判断 ,错误的
	//}
	//if a==nil{
	//
	//}

	//补充:map的value值可以是任意类型
	//var a map[int]map[string]string=make(map[int]map[string]string)
	//fmt.Println(a==nil)
	//fmt.Println(a[1]==nil)
	//// 报错了
	////a[1]=make(map[string]string)
	//a[1]= map[string]string{"1":"lqz"}
	////a[1]["1"]="lqz"
	//fmt.Println(a)

	//能听懂听懂,听不懂算了(字典在内存中怎么存的)
	//红黑树
	//var a =make(map[int]string,90)

	//循环map(必须会)
	var a =make(map[int]string)
	a[1]="xx"
	a[2]="uu"
	a[3]="99"
	a[4]="66"
	a[6]="99"
	fmt.Println(a)
	//这种不对
	//for i:=0;i<len(a);i++{
	//	fmt.Println(a[i])
	//}
	//map是无序的  python3.6之前也是无序的,3.6以后有序了,如何做到的
	//for k,v:=range a{
	//	fmt.Println(k)
	//	fmt.Println(v)
	//}


	





}




func test3(a map[int]string)  {
	a[1]="xxxxx"
	fmt.Println(a)
}
原文地址:https://www.cnblogs.com/mqhpy/p/12600568.html