switch使用细节(1)|学习笔记

简介: 快速学习switch使用细节(1)

开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:switch使用细节(1)】与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/625/detail/9570


switch使用细节(1)

一、switch使用注意事项和细节讨论

对于与switch细节讨论总结了10点,下面进行具体讨论。

1、特性一

case 后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以);

案例:

var key byte

fmt.Scanf(“%c”,&key)

switch ‘a’{ //可以将key变量改为a。

case ‘a’:

fmt.Println(“周一,猴子穿新衣”)

case ‘b’:

fmt.Println(“周二,猴子当小二”)

case ‘c’:

fmt.Println(“周三,猴子爬雪山”)

//…

default:

Fmt.Println(“输入有误”)

}

}

如上可以将 key 变量改为a,就意味着固定表达式的值为a,会永远匹配为周一,猴子穿新衣,这样从语法上是支持的,所以下面进行运行,如果输入为g,这个时候代码却并没有拿g进行匹配而是直接写的a,所以会输出猴子穿新衣。

运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

请输入一个字符a,b,c,d,e,f,g

g

周一,猴子穿新衣

说明直接写常量是可以的,甚至是一个有返回的函数也是可以的,比如写一个简单的函数 test,返回一个简单的值byte,代码为:

func test(b byte)byte{

return b+1  

//意思是传入b进来, byte+1再进行返回去。

}

switch test(key){ 

//test传入变量key,

case ‘a’:

fmt.Println(“周一,猴子穿新衣”)

case ‘b’:

fmt.Println(“周二,猴子当小二”)

case ‘c’:

fmt.Println(“周三,猴子爬雪山”)

//…

default:

Fmt.Println(“输入有误”)

}

运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

请输入一个字符a,b,c,d,e,f,g

a

周二,猴子当小二

发现以上输入a时返回为周二,猴子当小二,是因为输入a后函数给a加上1,a+1后对应的asc码字符为b,所以就匹配到了b的语句块。通过这个案例强调的是语句中表达式也可以是函数,甚至可以对表达式进行运算,如在test(key)后再加上1,代码为:

switch test(key)+1{ 

//这里主要讲的语法现象

case ‘a’:

fmt.Println(“周一,猴子穿新衣”)

case ‘b’:

fmt.Println(“周二,猴子当小二”)

case ‘c’:

fmt.Println(“周三,猴子爬雪山”)

//…

default:

Fmt.Println(“输入有误”)

}

运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

请输入一个字符a,b,c,d,e,f,g

a

周三,猴子爬雪山D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

请输入一个字符a,b,c,d,e,f,g

b

输入有误

如上输入a,a进行加1再加1,匹配到c的asc码值则输出周三,猴子爬雪山,输入b时,b进行加1再加1,匹配到d的asc码值,匹配不上,则输出输入有误。以上的案例强调的是表达式只要有一个值就行,不管是函数返回的还是预算得到的都可以,switch后可以这样写case后也可以写成函数或者变量。

2、特性二

case后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致。

案例:

var n1 int32 = 20

var n2 int32 =20

//定义两个变量n1,n1,都类型为int32,赋值为20

switch n1{

case n2:

//错误,原因是n2的数据类型和n1不一致

fmt.Println(“ok1”)

default:

fmt.Println(“没有匹配到”)

}

运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

ok1

此时运行程序匹配成功输出ok1,但是如果修改代码为:

var n1 int32 = 20

var n2 int64 =20

case n2:语句会出现提示报错,提示为 int64和 int32无效匹配,因此得出 switch 表达式数据类型要和case表达式数据类型保持一致,否则会报错,那如果把 case n1改为 case 20是可以的,因为是一个具体的值了,20是一个具体的数,他本身并不带数据类型,就相当于把20赋值给n1也是可以的,改为n2不行是因为n2不能直接赋值给n1,n1和n2的数据类型不一样,但是一个具体的值是可以的,因为具体的值并没有包含数据类型在里面,所以这里需要注意数据类型保持一致,否则会报错。

3、特性三

Case 后面可以带多个表达式,使用逗号间隔。比如 case 表达式1,表达式2...;

案例:

var n1 int32 = 5

var n2 int32 =20

switch n1{

case n2,10,5:

//case后面可以有多个表达式,可以为函数也可以为数值

fmt.Println(“ok1”)

default:

fmt.Println(“没有匹配到”)}

将程序修改为var n1 int32 = 5,则n1与case后表达式5进行匹配输出ok1

运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

ok1

4、特性四

case 后面的表达式如果是常量值(字面量),则要求不能重复

案例:

如果代码中前面有一个常量5,后面再进行case 5:则会报错,报错提示为case 5重复了,在前面已经定义过,所以重复定义语法上是不支持的,代码为:

var n1 int32 = 5

var n2 int64 =20

switch n1{

case n2:

fmt.Println(ok1

case 5://错误,因为前面有常量5,因此重复,就会报错(是变量就不会报错)

fmt.Println(ok2”)

default:

fmt.Println(没有匹配到)

}

但是变量就不会报错,比如再定义一个int32类型的变量n3,赋值为5。所以如果Case 后面的表达式不是常量值,编译器识别不出来认为是变量就不会报错,代码为:

var n1 int32 = 5

var n2 int64 =20

switch n1{

case n2:

fmt.Println(ok1)

case n3:

//不会报错,编译器识别不出来

fmt.Println(ok2”)

default

fmt.Println(没有匹配到”)

}

5、特性五

case 后面不需要带 break ,程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch ,如果一个都匹配不到,则执行 default;

前面已经讲过,这里不再细说。

6、特性六

default 语句不是必须的。

案例:

如下面案例不写default 语句也是可以的,n1等于51与case1语句和case2语句都不匹配,而后面也没有default,那就什么都不输出就可以。

代码为:

var n1 int32 = 51

var n2 int32 =20

switch n1{

case n2,10,5:  

//case 后面可以有多个表达式

fmt.Println(ok1)

case 90:

fmt.Println(ok2)

}

运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go

D:\goproject\src\go_code\chapter05\switchdemo\demo01>

运行结果什么都没有输出,说明 default 语句可以有也可以没有。

目录
打赏
0
0
0
0
1
分享
相关文章
前端基础(六)_流程控制语句(if、if-else、if-else嵌套、switch)
本文介绍了JavaScript中的流程控制语句,包括if、if-else、if-else嵌套和switch语句。
80 2
前端基础(六)_流程控制语句(if、if-else、if-else嵌套、switch)
if和switch流程控制语句的基本案例练习
通过以上案例练习巩固 if 和 switch 流程控制语句的使用。
|
8月前
switch的使用细节
switch的使用细节
69 0
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`<li>`),实现对动态生成列表项的点击事件处理。
73 1
Symbol从基础到原理,再到应用!
Symbol对于一些前端小白(比如我)来讲,没有特别使用过,只是在学习JS的时候了解了大概的概念,当时学习可能并没有感觉到Symbol在开发中有什么特别的作用,而在学习一段时间后回头看一遍,顿悟!
329 0
📕 重学JavaScript:如何实现一个`call`/`apply`?
这次要说的 call/apply 方法其实和 bind 极其类似。
95 0
【Python零基础入门篇 · 13】:字符串判断扩展、变量作用域、global和nonlocal的使用
【Python零基础入门篇 · 13】:字符串判断扩展、变量作用域、global和nonlocal的使用
110 0
【Python零基础入门篇 · 13】:字符串判断扩展、变量作用域、global和nonlocal的使用
【Python零基础入门篇 · 10】:字符串判断扩展、变量作用域、global和nonlocal的使用
【Python零基础入门篇 · 10】:字符串判断扩展、变量作用域、global和nonlocal的使用
122 0
【Python零基础入门篇 · 10】:字符串判断扩展、变量作用域、global和nonlocal的使用
C/C++零散知识点汇总之switch实现原理&switch和if-else对比
C/C++零散知识点汇总之switch实现原理&switch和if-else对比