GO语言学习(三) 流程控制+数组,切片,map

目录

if语句

if else if语句

Switch语句 

for循环

for range循环

break关键字

continue关键字

关键字goto

golang数组

定义

初始化

改变元素

访问数组元素

golang切片(slice)

声明

golang切片初始化

切片的遍历

切片的增删改查和copy

增加

删除

更改

查找

copy

golang Map

声明

赋初值

访问map

判断某个键是否存在

遍历

总代码


if语句

if 布尔表达式{

        //一些执行内容

}

注意:

1、布尔表达式没有括号

2、左括号与if、else在同一行

3、大括号必须存在,即使只有一行语句

4、不能使用0或者非0表示真假

5、初始变量可以声明在布尔表达式里面,注意作用域

package main

import (
	"fmt"
)

func main() {
	//if表达式
	a:=1
	b:=2
	if a>b {
		fmt.Printf("%v\n", a)
	}else{
		fmt.Printf("%v\n", b)
	} 
	//flag是关键字,最好不要使用
	flag1:=true
	if flag1{
		fmt.Printf("%v\n", flag1)
	}
	//初始变量可以声明在布尔表达式里面,注意作用域
	if age:=20;age>18{
		fmt.Println("成年")
	}
	//不能使用0或者非0表示真假
}

if else if语句

package main

import (
	"fmt"
)

func f1(){
	score:=90
	if score>=60 &&score <=70{
		fmt.Println("C")
	}else if score>70 &&score<=90{
		fmt.Println("B")
	}else{
		fmt.Println("A")
	}
}

func main() {
	//if else表达式
	var c string
	fmt.Println("请输入一个字符")
	fmt.Scan(&c)
	if c=="S"{
		fmt.Println("请输入第二个字符")
		fmt.Scan(&c)
		if c=="a"{
			fmt.Println("Saturday")
		}else if c=="u"{
			fmt.Println("Sunday")
		}else{
			fmt.Println("输入错误")
	}
	}else if c=="F"{
		fmt.Println("Friday")
	}else if c=="M"{
		fmt.Println("Monday")
	}else if c=="T"{
		fmt.Println("请输入第二个字符")
		fmt.Scan(&c)
		if c=="u"{
			fmt.Println("Tuseday")
		}else if c=="h"{
			fmt.Println("Thursday")
		}else{
			fmt.Println("输入错误")
		}
	}
}

fmt.Scan(&a) 可以输入字符,有需要用户输入的需要在终端使用 go run运行

Switch语句 

注意加上fallthrough之后就可以执行后面的case(无论是否符合条件都会执行下一个case,但是仅仅对下面这个case有作用)

package main

import (
	"fmt"
)
func f1(){
	//运行结果是A,不是A、B;虽然没有break,但是满足第一个条件之后,后面就不再执行了
	grade:='A'
	switch grade {
	case 'A':
		fmt.Println("优秀")
		grade = 'B'
	case 'B':
		fmt.Println("良好")
	case 'C':
		fmt.Println("一般")
	default:
		fmt.Println("其他")
	}
}
func f4(){
	//运行结果A、B;,加上fallthro之后就可以执行后面满足条件的了
	grade:='A'
	switch grade {
	case 'A':
		fmt.Println("优秀")
		grade = 'B'
		fallthrough
	case 'B':
		fmt.Println("良好")
		grade = 'C'
	case 'C':
		fmt.Println("一般")
	default:
		fmt.Println("其他")
	}
}
func f2(){
	//case中可以有多个值,匹配其中之一就可以
	day:=3
	switch day{
	case 1,2,3,4:
		fmt.Println("工作日")
	case 5,6,7:
		fmt.Println("休息")
	}
}
func f3(){
	//case中可以是条件表达式
	score:=90
	switch{
	case score>=90:
		fmt.Println("优秀")
	default:
		fmt.Println("一般")
	}
}

func main() {
	//switch语句  没有break
	f1()
	f4()
	f2()
	f3()

	
}

for循环

Golang中只有for循环

package main

import (
	"fmt"
)

func f1(){
	//和cpp中用法一样
	for i:=1;i<=10;i++{
		fmt.Printf("i:%v\n",i)
	}
}
func f2(){
	//和cpp中while用法一样。初始条件放到外面,改变条件放在循环体中
	i:=1
	for i<=10{
		fmt.Printf("i:%v\n", i)
		i++
	}
	//while(i<=10){
	//	i++
	//}
}
func f3(){
	//永真循环
	for{
		fmt.Println("run....")
	}
}

func main() {
	//for循环
	f1()
	f2()
	f3()
	
}

for range循环

GO语言中可以使用for range遍历数组、切片、字符串、map及通道(channel)。通过 for range遍历的返回值有如下规律

1、数组、切片、字符串返回索引和值

2、map返回键和值

3、通道(channel)只返回通道内的值

package main

import (
	"fmt"
)
func f1(){
	//遍历数组
	var a = [5]int{1,2,3,4,5}
	for i,v:=range a{
		fmt.Printf("i:%v ", i)
		fmt.Printf("v:%v\n", v)
	}
	/*  i是索引,v是值
	i:0 v:1
	i:1 v:2
	i:2 v:3
	i:3 v:4
	i:4 v:5
	*/
	for _,v:=range a{
		// fmt.Printf("i:%v ", i)
		fmt.Printf("v:%v\n", v)
	}
	/*
	v:1
	v:2
	v:3
	v:4
	v:5
	*/
}
func f2(){ 
	//遍历切片 切片是动态的数组 []里面什么都没有就是切片
	var s = []int{1,2,3}
	for _,v:=range s{
		fmt.Printf("v:%v\n", v)
	}
}
/*
v:1
v:2
v:3
*/
func f3(){
	//遍历map,map对应着key:value map[string]string  第一个string是key的类型,第二个string是value的类型
	var m=make(map[string] string,0)
	m["name"] = "tom"
	m["age"]="20"
	for key,value:=range m{
		fmt.Printf("key:%v ", key)
		fmt.Printf("value:%v\n", value)
	}
	/*
	key:name value:tom
	key:age value:20
	*/
}
func f4(){
	//遍历字符串
	var b="hello world"
	for i,v:=range b{
		fmt.Printf("i:%v ", i)
		fmt.Printf("v:%c\n", v)
	}
}

func main() {
	f1()
	f2()
	f3()
	f4()
	
}

break关键字

break用在for循环中时,可以跳出循环

package main

import (
	"fmt"
)

func f1(){
	// for中brak的使用
	for i := 0; i < 10; i++ {
		fmt.Println(i)
		if i>=5 {
			break;
		}
	}
}
/*
0
1
2
3
4
5  到5的时候循环退出了,所以break可以跳出循环
*/

func f2(){
	//switch中break的使用
	i:=2
	switch i {
	case 1:
		fmt.Println("1")
		break
	case 2:
		fmt.Println("2")
		// break  
		//加了break之后就没法穿透3了
		// fallthrough
	case 3:
		fmt.Println("3")
	}
}
/*
有break输出是2
没有break输出是 2 3
没有break和fallthrough输出是 2
*/

func f3(){
	//break可以跳转到某一个标签
MYLABEL:  //这是一个标签的定义
	for i := 0; i < 10; i++ {
		if i>=5{
			break MYLABEL //i>=5后跳转到MYLABEL处
		}
	}
	fmt.Println("end...")
}
func main() {
	f1()
	f2()
	f3()
	
}

continue关键字

只能用在for循环中,可以中止本次循环,进行下一次循环。

在continue语句后面添加标签时,表示开始标签对应的循环

package main

import (
	"fmt"
)
func f1(){
	//用在for循环中
	for i := 0; i < 10; i++ {
		if i%2==0{
			fmt.Printf("i:%v\n", i)
		}else{
			continue
		}
	}
/*
i:0
i:2
i:4
i:6
i:8
*/
}
func f2(){
//跳到某个标签里
	for i := 0; i < 10; i++ {
	MYLABEL:
		for j := 0; j < 10; j++ {
			if i==2&&j==2{
				break MYLABEL
			}
			fmt.Printf("%v,%v\n", i,j)
		}
	}
/*
不会打印出2,2
因为到2,2时,跳到了标签label处,没有继续执行 
如果是break,后面的2,3 2,4.。。。都不会输出了,直接从3,0开始
*/
}

func main() {
	f1()
	f2()
	
}

关键字goto

package main

import (
	"fmt"
)

func f1(){
	a:=0
	if a>=2{
		fmt.Println("yes")
	}else{
		goto END
	}

END:
	fmt.Println("END...")
/*
goto到了END
*/
}
func f2(){
	//跳出双层循环
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if i>=2 && j>=2{
				goto END
			}
			fmt.Printf("%v,%v\n", i,j)
		}
	}
END:
fmt.Println("END...")
/*
输出到2,1之后就输出END...了
*/
}


func main() {
	f1()
	f2()
}

golang数组

定义

package main

import (
	"fmt"
)

func f1(){
	//数组定义
	var a1 [2]int
	var a2 [3]string
	fmt.Printf("a1:%T\n", a1) //a1:[2]int
	fmt.Printf("a2:%T\n", a2) //a2:[3]string
	//没有赋初值是什么样的?
	fmt.Printf("a1:%v\n", a1) //a1:[0 0]
	fmt.Printf("a2:%v\n", a2) //a2:[  ]
}

func main() {
	f1()
	// f2()
}

初始化

package main

import (
	"fmt"
)


func f2(){
	//初始化
	//方式一:使用初始化列表初始化
	var a1 = [2]int{1,2}
	fmt.Printf("a1:%v\n", a1) //a1:[1 2]
	var b1 = [3]int{1,2}
	fmt.Printf("b1:%v\n", b1) //b1:[1 2 0]
	var a2 = [2]string{"hello","world"} 
	fmt.Printf("a2:%v\n", a2) //a2:[hello world]
	var a3 = [2]bool{true,false}
	fmt.Printf("a3:%v\n", a3) //a3:[true false]
	//方式二:省略长度,默认初始化列表的长度为数组的长度
	var a4 = [...]int{1,2,3,4}
	fmt.Printf("a4:%v\n", a4) //a4:[1 2 3 4]
	fmt.Printf("a4:%T\n", a4) //a4:[4]int
	//方式三:指定索引值的方式来初始化
	var a5 = [3]string{0:"hello",2:"here"}
	fmt.Printf("a5:%v\n", a5) //a5:[hello  here]
	var a6 = [...]string{0:"hello",3:"here"}
	fmt.Printf("a6:%v\n", a6) //a6:[hello   here]
	var a7 = [...]int{0:1,4:3}
	fmt.Printf("a7:%v\n", a7) //a7:[1 0 0 0 3]
	fmt.Printf("a7:%T\n", a7) //a7:[5]int
}

func main() {
	// f1()
	f2()
	// f3()
}

改变元素

package main

import (
	"fmt"
)


func f3(){
	//修改
	var a1=[...]int{1,2,3}
	fmt.Printf("a1:%v\n", a1) //a1:[1 2 3]
	a1[0]=100
	fmt.Printf("a1:%v\n", a1) // a1:[100 2 3]
}

func main() {
	// f1()
	// f2()
	f3()
}

访问数组元素

通过下标访问

package main

import (
	"fmt"
)
func f1(){
	var a1=[...]int{1,2,3,4,5,6}
	for i:=0;i<len(a1);i++{
		fmt.Printf("%v ", a1[i])
	}
	for i,v:=range a1{
		fmt.Printf("%v %v\n",i,v)
	}
}

func main() {
	f1()
}

golang切片(slice)

切片是可变长度的数组

声明

声明一个切片和一个数组类似,只要不添加长度就可以了

var identifier []type

切片是引用类型,可以使用make函数来创建切片

var slice1 []type = make([]type,len)
也可以简写为
slice1 := make([]type,len)

也可以指定容量,其中capacity是可选参数

make([]T,length,capacity)

 示例 (注意一下两种声明方式的区别)

package main

import (
	"fmt"
)
func f1(){
	//切片声明
	//方式一:类似于声明变量
	var s1 []int 
	var s2 []string
	fmt.Printf("s1:%v\n", s1) //s1:[] 使用这种方式没有分配内存还,所以是空
	fmt.Printf("s2:%v\n", s2) //s2:[]
	//方式二:通过make函数来声明 前面是类型,后面是size,通过make声明需要指定长度,但是长度可变
	var s3 =make([]int,2)
	fmt.Printf("s3:%v\n", s3)  //s3:[0 0] 说明make方式已经分配了内存了,所以有默认值
}
func f2(){
	//切片的长度和容量的定义
	var s1 = []int{1,2,3}
	fmt.Printf("len:%v\n", len(s1)) //len:3
	fmt.Printf("cap:%v\n", cap(s1)) //cap:3
	
}
func main() {
	// f1()
	f2()
}

golang切片初始化

package main

import (
	"fmt"
)

func f1(){
	//方式一:直接初始化
	var s1 = []int{1,2,3}
	fmt.Printf("%v", s1)
	//方式二:使用数组初始化 取全部元素
	arr:=[...]int{1,2,3,4}
	s2:=arr[:]
	fmt.Printf("%v", s2) //[1 2 3 4]
	//取部分元素
	s3:=arr[2:4]
	fmt.Printf("%v", s3) //[3 4]
	fmt.Printf("%T", s3) //[]int 切片
	fmt.Printf("%T", arr) //[4]int 数组

}
func main() {
	f1()
	// f2()
}

切片的遍历

package main

import (
	"fmt"
)

func f1(){
	s1:=[]int{1,2,3,4,5,6}
	for i := 0; i < len(s1); i++ {
		fmt.Printf("%v\n", s1[i])
	}
	for i,v:=range s1{
		fmt.Printf("%v %v\n", i,v)
	}

}
func main() {
	f1()
	// f2()
}

切片的增删改查和copy

增加

//添加
func f1(){
	s1 := []int{}
	//添加
	s1 = append(s1,100) 
	s1 = append(s1,200)
	s1 = append(s1,300)
	fmt.Printf("%v\n", s1) //[100 200 300]
}

删除

删除是通过append来实现的

func f2(){
	var s1=[]int{1,2,3,4,5}
	//如果要删除3 ,索引是2
	s1 = append(s1[:2],s1[3:]...) //添加从开头到(2-1)1的索引元素
	//公式 a=append(s1[:index],s1[index+1]...)
	fmt.Printf("%v\n", s1) //[1 2 4 5]
}

更改

func f3(){
	var s1=[]int{1,2,3,4,5}
	s1[1]=100
	fmt.Printf("%v\n", s1) //[1 100 3 4 5]
}

查找

func f4(){
	var s1=[]int{1,2,3,4,5}
	var key=2;
	for i,v :=range s1{
		if v==key{
			fmt.Println(i) //1
		}
	}
}

copy

注意:对于一般的复制情况,例如 var s2=s1,实际上是把s1的地址赋值给了s2,所以改变s1或者s2时,另一个都会跟着改变。为了解决这种情况,使用copy函数,copy(目标、源)。这样就是只复制了值,修改一个时,另一个不会跟着改变

func f5(){
	var s1=[]int{1,2,3,4,5}
	var s2 = s1
	s2[0]=100
	fmt.Printf("%v\n", s1) //[100 2 3 4 5]
	fmt.Printf("%v\n", s2) //[100 2 3 4 5]
	/*
	发现:把s2复制给s1之后,如果s2改变,则s1也会改变
	原因:var s2=s1这种赋值方式是直接把s1的地址赋值给了s2,
	    所以修改一个,另一个也会改变
	*/
	//解决办法:copy
	s3 := make([]int,4)
	copy(s3,s1) //copy(目标,源)
	s3[2]=100
	fmt.Printf("%v\n", s1) //[100 2 3 4 5]
	fmt.Printf("%v\n", s3) //[100 2 100 4]
}

golang Map

map是一种key:value键值对的数据结构容器。map内部实现是哈希表。

map最重要的一点是通过key来快速检索数据。key类似于索引,指向数据的值

map是引用类型的

声明

//声明
func f1(){
	var m1 map[string]string //声明
	m1 = make(map[string]string) //初始化 不初始化的话无法添加元素
	fmt.Printf("%v\n", m1) //map[]
	fmt.Printf("%T\n", m1) //map[string]string
}

赋初值

//赋初值
func f2(){
	//方式一:大括号
	var m1 =map[string]string{"name":"zxx","age":"21"} 
	m1["BF"]="QYC"
	fmt.Printf("%v\n", m1) //map[age:21 name:zxx] map是无序的
	//方式二:make
	m2:=make(map[string]string)
	m2["name"]="tome"
	m2["age"]="11"
	fmt.Printf("%v\n", m2) //map[age:11 name:tome]
}

访问map

//赋初值
func f2(){
	//方式一:大括号
	var m1 =map[string]string{"name":"zxx","age":"21"} 
	m1["BF"]="QYC"
	fmt.Printf("%v\n", m1) //map[age:21 name:zxx] map是无序的
	//方式二:make
	m2:=make(map[string]string)
	m2["name"]="tome"
	m2["age"]="11"
	fmt.Printf("%v\n", m2) //map[age:11 name:tome]
}

判断某个键是否存在

//判断某个键是否存在 value,ok:=s2["name"]
//如果这个键存在,则value给出对应的值,且ok返回为true
//否则,value返回空,ok为false
func f4(){
	var s2 = map[string]string{"name":"zxx","age":"22"}
	value,ok:=s2["name"]
	fmt.Printf("%v %v\n",value,ok ) //zxx true
	value,ok=s2["name1"]
	fmt.Printf("%v %v\n",value,ok ) // false
}

遍历

func f5(){
	var s2 = map[string]string{"name":"zxx","age":"22"}
	for key:=range s2{
		fmt.Printf("%v\n", key) //name age
	}
	for key,value:=range s2{
		fmt.Printf("%v %v\n", key,value) //name zxx name zxx
	}
	for _,value:=range s2{
		fmt.Printf("%v\n",value) //22
	}
}

总代码

package main

import (
	"fmt"
)
/*
map的声明、赋值和遍历
*/

//声明
func f1(){
	var m1 map[string]string //声明
	m1 = make(map[string]string) //初始化 不初始化的话无法添加元素
	fmt.Printf("%v\n", m1) //map[]
	fmt.Printf("%T\n", m1) //map[string]string
}
//赋初值
func f2(){
	//方式一:大括号
	var m1 =map[string]string{"name":"zxx","age":"21"} 
	m1["BF"]="QYC"
	fmt.Printf("%v\n", m1) //map[age:21 name:zxx] map是无序的
	//方式二:make
	m2:=make(map[string]string)
	m2["name"]="tome"
	m2["age"]="11"
	fmt.Printf("%v\n", m2) //map[age:11 name:tome]
}
//访问map
func f3(){
	m1:=make(map[string]string)
	m1["name"]="zxx"
	m1["age"]="22"
	fmt.Printf("%v\n", m1) //map[age:22 name:zxx]
	fmt.Printf("%v\n", m1["age"]) //22
}
//判断某个键是否存在 value,ok:=s2["name"]
//如果这个键存在,则value给出对应的值,且ok返回为true
//否则,value返回空,ok为false
func f4(){
	var s2 = map[string]string{"name":"zxx","age":"22"}
	value,ok:=s2["name"]
	fmt.Printf("%v %v\n",value,ok ) //zxx true
	value,ok=s2["name1"]
	fmt.Printf("%v %v\n",value,ok ) // false
}
//遍历
func f5(){
	var s2 = map[string]string{"name":"zxx","age":"22"}
	for key:=range s2{
		fmt.Printf("%v\n", key) //name age
	}
	for key,value:=range s2{
		fmt.Printf("%v %v\n", key,value) //name zxx name zxx
	}
	for _,value:=range s2{
		fmt.Printf("%v\n",value) //22
	}
}

func main() {
	f1()
	f2()
	f3()
	f4()
	f5()
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值