Go语言pointer及switch fallthrough
王中阳Go 人气:0前言
今天继续为大家更新Go语言学习记录的文章。
首先说明pointer指针
和switch
是两个并没有直接关系的知识点,放在一篇文章中将的原因是,这两个知识点在学习和使用的过程中往往被大家忽视。
pointer
go语言不存在指针操作,只有2个符号: &取内存地址 *根据内存地址取值
应用
n := 18 // 取地址 fmt.Println(&n) fmt.Println(*&n)
打印结果:
查询内存地址的类型
p := &n // 根据地址取值 fmt.Printf("%T\n", p) // 打印结果是*int,即int类型的指针 m := *p fmt.Println(m) //根据地址取值
打印结果:
我们发现打印的结果是:*int,即int类型的指针
nil pointer
var a1 *int //nil pointer fmt.Println(a1) //<nil> var a2 = new(int) fmt.Println(a2) //内存地址 0xc000108010 fmt.Println(*a2) //0 根据内存地址取值 没有值返回0 *a2 = 100 //根据内存地址赋值 fmt.Println(*a2) //100
打印结果:
小结
- 对变量进行取地址操作(&),可以获得这个变量的指针变量
- 指针变量的值是指针地址(内存地址)
- 对指针变量进行取值操作(*),可以获得这个指针变量指向原变量的值,即通过内存地址取值。
switch
我们往往习惯于使用if判断,switch可以简化我们的if判断。
switch的作用和if是一样的,都是进行条件判断,引入switch的原因是能简化我们的if判断,让代码的可读性更强。
可读性更好
举个栗子:
if判断来判断手指的名称:
finger :=2 if finger==1 { fmt.Println("大拇指") }else if finger==2 { fmt.Println("食指") }else if finger==5 { fmt.Println("小拇指") }else { fmt.Println("无效") }
switch判断手指名称
finger := 2 switch finger { case 1: fmt.Println("大拇指") case 2: fmt.Println("食指") case 5: fmt.Println("小拇指") default: fmt.Println("无效") }
对比之下立竿剪影:switch case 这种方式可读性更好。
case后支持多个参数
举个栗子:奇偶数判断
switch n := 3; n { case 1, 3, 5, 7, 9: fmt.Println("奇数") case 2, 4, 6, 8, 10: fmt.Println("偶数") }
case后加判断
举个栗子:
age := 29 switch { case age < 18: fmt.Println("好好学习Z") case age > 18 && age < 60: fmt.Println("好好上班") case age > 60: fmt.Println("希望不用继续上班了,哈哈") default: fmt.Println(age) }
注意:当在case后加判断时,switch后面不需要传入参数,否则会报错:类型不匹配。
fallthrough
使用建议
在一个 switch 块内,每个 case 无需声明 break 来终止 , 如果想顺序执行使用 fallthrough ;在一个switch块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有。
package main import "fmt" func main() { switch { case false: fmt.Println("false1") fallthrough case true: fmt.Println("true1") fallthrough case false: fmt.Println("false2") fallthrough case true: fmt.Println("true2") case false: fmt.Println("false3") fallthrough default: fmt.Println("default case") } }
总结
相信大家阅读完这篇文章对go语言中的指针有了更深刻的理解
至于switch,只要我们心里有这个概念即可:switch作用和if一样,当我们意识到需要写多个if判断时,改用switch实现,往往会是比较好的实践。
加载全部内容