GO基础小结

go语言基础小结

(李文州老师的课)

1.流程控制

1.If

if 条件1{
	分支1
}else if 条件2{
	分支2
}else 条件3{
	分支3
}			

2.for循环

1.标准写法
for i:=0;i<=10;1++{
	fmt.println(i)
}	
2.省略初始语句
i:=0
for ;i<=10;i++{
	fmt.println(i)
}	
3.初始与结束语句都省略
i:=0
for  ;i<=10{
	fmt.println(i)
	i++	
}
4.无限循环

break、goto、panic、return强制退出循环

for {
	循环体
}	

3.for range 遍历

遍历对象:数组、切片、map、channel、字符串

4.switch case(对大量的值进行条件判断)

一个switch只能有一个default

1.
finger:=3
switch finger{
	case1:
		fmt.println("大拇指")
	case2:
		fmt.println("食指")
	case3:
		fmt.println("中指")
	case4:
		fmt.println("无名指")
	case5:
		fmt.println("小拇指")
	default:
		fmt.println("输入无效")
2.
switch n:=1;n{
case 1,3,5,7,9:
	fmt.println("奇数")
case 2,4 6,8 :
	fmt.println("偶数")
default :
	fmt.println("输入无效")
}
3.当分支后有表达式时,分支后不用跟变量
age:=30
switch {
	case age<18:
		fmt.println("五年高考,三年模拟")
	case age>18:
		fmt.println("人生开始了")
	default:
		fmt.println("活着真好")
}

5.goto(跳转到指定标签)

6.break

7.continue(跳过本次循环,进行下一次循环)

continue后的所有语句都不执行,直接进行下一次循环

8.练习:九九乘法口诀表

package main

import "fmt"

func main() {
	for i:=1;i<=9;i++{
		for j:=1;j<=i;j++{
			fmt.Printf("%vx%v=%v\t",i,j,i*j)
			}
		fmt.Println("")//重中之重!!!!!!
	}
}
1x1=1	
2x1=2	2x2=4	
3x1=3	3x2=6	3x3=9	
4x1=4	4x2=8	4x3=12	4x4=16	
5x1=5	5x2=10	5x3=15	5x4=20	5x5=25	
6x1=6	6x2=12	6x3=18	6x4=24	6x5=30	6x6=36	
7x1=7	7x2=14	7x3=21	7x4=28	7x5=35	7x6=42	7x7=49	
8x1=8	8x2=16	8x3=24	8x4=32	8x5=40	8x6=48	8x7=56	8x8=64	
9x1=9	9x2=18	9x3=27	9x4=36	9x5=45	9x6=54	9x7=63	9x8=72	9x9=81	

2.数组

1.定义

统一数据类型元素的集合

声明数组
var a [长度]int

2.初始化

1.声明时直接初始化
var a [3]int{0,1,2}
var b [2]string{"北京","上海"}
2.不声明长度,自动填入
var a [...]int{1,2,3,4}
var b  [...] string{"北京","上海","深圳"}
3.索引式初始化
var a [3]int{0:1,1:2}

3.数组遍历

1.for循环遍历
var a =[...]int{0,1,2}
for i:=0; i<len(a); i++{
	fmt.println(a[i])
}
2.for range 遍历
1.索引式遍历
var b= [...]string{"北京","上海","深圳"}
for index ,value:=range b{
	fmt.println(index,value)
}
2.无索引遍历
var b =[...]string {"北京","上海","深圳"}
	for_,v:=range b{
	fmt.println(v)

4.多维数组(以二维数组为例)

1.二维数组的定义
func main(){
	var a:=[3][2]string{
	{"我","是"},
	{"雄","安"},
	{"新","区"},
}
//访问“雄”
fmt.println(b[1][0])//层层访问
2.二维数组的遍历
func main(){
	var a:=[3][2]string{
	{"我","是"},
	{"雄","安"},
	{"新","区"},
}
//我自己摸索的:
for _,value:=range a{
		for _,value1:=range value{
			fmt.Println(value1)
		}
	}
//李文州老师的:
for _, v1 := range a {
		for _, v2 := range v1 {
			fmt.Printf("%s\t", v2)
		}
		fmt.Println()
	}
}

5.数组是值类型

赋值、传参会复制整个数组,改变副本不影响本身,传参或赋值之后,改变母本,也不影响副本。
赋值,传参之后,互不相干

b1:=[3]int {1,2,3}//b1[1,2,3]
		b2:=b1//b2:[1,2,3]
		b1[0]=5//b1[5,2,3]
		b2[0]=100//b2:[100,2,3]
		fmt.Println(b1,b2)
		//b1[5,2,3]
		//b2[100,2,3]

6.练习:作业

1.求数组[1, 3, 5, 7, 8]所有元素的和
func main() {
	b:=0
	a:=[...]int{1,3,5,7,8}
	for _,v:=range a{
		b=b+v
	}
	fmt.Println(b)
}
//24
2.找出数组中和为指定值的两个元素的下标,比如从数组[1, 3, 5, 7, 8]中找出和为8的两个元素的下标分别为(0,3)和(1,2)。
func main() {
var a =[...]int{1,3,5,7,8}
for i1,v1:=range a{
	for i2,v2:=range a{
		if v1+v2==8{
			fmt.Printf("(%v,%v\t)",i1,i2)
		}
	}
}
}//上述代码会出现重复,不大好!!!

结果是:
(0,3 )(1,2 )(2,1 )(3,0 )
更好的代码段

func main() {
var a =[...]int{1,3,5,7,8}
for i1,v1:=range a{
	for i2,v2:=range a{
		if v1+v2==8{
			fmt.Printf("(%v,%v\t)",i1,i2)
		}
	}
}
}

结果是:
(0,3 )(1,2 )

3.切片

切片&数组

数组的长度固定,不可自动扩容,使用起来有较大局限性
切片是拥有相同类型元素的可变长度的序列,是基于数组的封装,
切片的底层是数组

1.切片定义

1.定义切片
var a []string
var b [] int
var c [] bool
2.切片初始化
var a =[] string {"小","王","子"}
var b =[] int{1,2,3}
var c =[] bool{true,false}
3.切片有自己的长度和容量,并且会自动扩容。
4.切片==nil是没有底层数组
var a []int//a==nil(a没有底层数组,打印结果:[])
var b =[]int{}//b!=nil(b有底层数组,底层数组为空,打印结果:[])
//初始化了就不==nil

2.构造切片

1.由数组得到切片

切片依仗底层数组存活

  1. 切片指向底层数组
  2. 切片的容量是底层数组的容量
  3. 改变底层数组,则改变全部切片
//声明一个数组:
	a1:=[...]int{1,2,3,4,5,6,3,7,0,8}
//切割数组:得到s3:[1,2,3,4](包左不包右)
	s3:=a1[0:4]
	fmt.Println(s3)
	s4:=a1[2:6]//s4:[3,4,5,6,3]
	fmt.Println(s4)
	s5:=a1[:4]//s5:[1,2,3,4]
	s6:=a1[2:]//s6:[3,4,5,6,3,7,0,8]
	s7:=a1[:]//s7:[1,2,3,4,5,6,3,7,0,8]
	fmt.Println(s5,s6,s7)
	fmt.Printf("len(s5):%d cap(s5):%d\n",len(s5),cap(s5) )
	//切片的容量是底层数组的容量!!!!!
	//len(s5):4 ,cap(s5):10
	fmt.Printf("len(s6):%d cap(s6):%d\n",len(s6),cap(s6) )
	//len(s6):8, cap(s6):8
	//切片是指向了一个底层数组。
	//切片额度长度是他元素的个数
	//切片的容量是:底层数组从第一个元素到最后一个元素。
	//切片支持扩容
	//切片再切片,切片是一个引用类型,他们都指向底层的数组,
	s8:=s6[3:]//s8:[6,3,7,0,8]
	fmt.Printf("len(s8):%d cap(s8):%d\n",len(s8),cap(s8)  )
	//len(s8):5,cap(s5):5
	fmt.Println(a1,s6,s8)
	//改变底层数组
	a1[6]=13000//a1:[1,2,3,4,5,13000,3,7,0,8]
	//一改则全改
	fmt.Println(s6)//s6:[3 4 5 6 13000 7 0 8]
	fmt.Println(s8)//s8:[6 13000 7 0 8]

2.make函数构造切片

定义方法:
make ([]类型 大小 容量)

//make ([]T,size,cap)
	s1:= make ([]int ,5,10)
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n",s1,len(s1) ,cap(s1) )
//s1=[0,0,0,0,0],len(s1):5,cap(s5):10
	//如果定义的时候没有定义容量,则容量=长度
	s2:= make ([]int ,0,10)
	fmt.Printf("s2=%v len(s2)=%d cap(s2)=%d\n",s2,len(s2) ,cap(s2))
	//如果标注长度为零,则数组为空
//s2=[],len(s2):0,cap(s2):10
	//切片的本质:就是一个框,框住了一块连续的内存。属于应用类型,真正的数据都是保存在底层数组中。
	//切片的长度是里面东西的个数。
	//切片之间不可以直接比较,
	//一个nil值的切片的长度和容量都是0;
	//但我们不可以说一个长度和容量都是0的切片一定是nil。详见c与a
	var a[]int//切片为空,没有初始化,无底层数组
	fmt.Printf("len(a)=%d cap(a)=%d\n",len(a) ,cap(a))//a=nil
	b:=[]int {}//切片不为空,有自己的底层数组,底层数组为空
	fmt.Printf(" len(b)=%d cap(b)=%d\n",len(b) ,cap(b))//b!=nil
	c:=make ([]int, 0)//一个长度和容量都为0的切片不一定为空
	fmt.Printf("len(c)=%d cap(c)=%d\n",len(c),cap(c))//c!=nil
//如果要判断一个切片是否为空,要用len(s)==0判断,而不能用s==nil来判断
	fmt.Println(a==nil)//true
	fmt.Println(b==nil)//false
	fmt.Println(c==nil)//false
3.append方法添加元素
func main(){
	var s []int
	s = append(s, 1)        // [1]
	s = append(s, 2, 3, 4)  // [1 2 3 4]
	s2 := []int{5, 6, 7}  
	s = append(s, s2...)    // [1 2 3 4 5 6 7]
}
4.从切片中删除元素

Go语言中没有相应删除元素的语言
利用append方法删除元素
记得加上…

func main() {
	// 从切片中删除元素
	a := []int{30, 31, 32, 33, 34, 35, 36, 37}
	// 要删除索引为2的元素
	a = append(a[:2], a[3:]...)
	fmt.Println(a) //[30 31 33 34 35 36 37]
}

3.切片的赋值拷贝与复制

1.赋值拷贝一变都变

赋值拷贝之后共用同一底层数组一变都变
切片是引用类型,s1与s2指向同一块内存地址,修改其中一个另一个也会改变。

func main() {
	s1 := make([]int, 33) //[0 0 0]
	s2 := s1             //将s1直接赋值给s2,s1和s2共用一个底层数组
	s2[0] = 100
	fmt.Println(s1) //[100 0 0]
	fmt.Println(s2) //[100 0 0]
}

2.copy()函数复制个变个的

不牵扯底层数组

func main() {
	// copy()复制切片
	a := []int{1, 2, 3, 4, 5}//构造底层数组
	c := make([]int, 5, 5)//使用make()函数构造切片
	copy(c, a)     //使用copy()函数将切片a中的元素复制到切片c
	fmt.Println(a) //[1 2 3 4 5]
	fmt.Println(c) //[1 2 3 4 5]
	c[0] = 1000
	fmt.Println(a) //[1 2 3 4 5]
	fmt.Println(c) //[1000 2 3 4 5]
}
3.append改变底层数组
a:=[...]int{1,2,3,4,5,6,7,8,9}
	b:=a[:]
	b=append(a[0:1],a[2:]...)
	fmt.Println(a,b)//append会改变底层数组
//a:[1,3,4,5,6,7,8,9,9]
//b:[1,3,4,5,6,7,8,9]

4.切片的遍历

1.for循环遍历
a:=make ([]int,3,3)
	 a=append(a,1,2,3)
	 for i:=0;i<len(a);i++{
	 	fmt.Println(a[i])
	 } 
//遍历结果:
0
0
0
1
2
3

2.for range 遍历
a:=make ([]int,3,3)
	 a=append(a,1,2,3)
	 for i,v:=range a{
	 	fmt.Println(i,v)
	 }
//遍历结果:
0 0
1 0
2 0
3 1
4 2
5 3

课后作业

1.写出下列代码的结果

func main() {
	var a = make([]int, 5, 10)
	for i := 0; i < 10; i++ {
		a = append(a,i)
	}
	fmt.Println(a)
}//000000123456789

2…请使用内置的sort包对数组var a = […]int{3, 7, 8, 9, 1}进行排序(附加题,自行查资料解答)。

将接口的时候再说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值