最近有朋友说,我这个系列教程写好了就不再更新和改变了,不如去官网自己看文档,这点我不反对,还非常的赞同。我出这个系列教程也是出于是GO语言的喜欢,所以趁着此机会自己也可以系统的再过一遍GO语言。我希望它变得更好。可以把我这个GO语言系列的当成是一个试金石,敲门砖,算是抛砖引玉吧,先大概看下是不是喜欢和适合。如果非常感兴趣,那就可以继续跟我这个教程,或者去官网看文档就更专业,我也不反对,因为这与我的目标是一致的,非常感谢朋友的建议。
活到老学到老,学海无涯,学无止境,我发现做了这么久的技术了,我仍然是井底之蛙,做技术还不懂的还有很多很多,朋友们一起共勉,努力学习。下面开始今天的分享。这一期分享一下for循环与switch语句,本期分为以下几个部分:
- for循环的语法
- for循环的注意事项
- for循环几种常用方式
- switch语句的语法
- switch语句的注意事项
- for循环与switch语句举例
一、for循环的语法
for 初始化语句; 条件判断语句; 自增加语句 {
执行语句
}
二、for循环的注意事项
for循环语句需要注意以下几项:
- GO语言中只有for循环这一种循环语句,是没有while和do while的。
- for关键字必须与左花括号在同一行
- for的初始化语句,条件判断语句,自增加语句都可省略,从而形成简明死循环的写法。
- for语句不需要再写圆括号,同时支持continue和break,值得一提的是它支持break那层循环。但得配置标签使用。但是这个与c语言中的goto有点像,跳来跳去,使用时要慎重。
三、for循环几种常用方式
3.1 for遍历map与切片
这个前面已经写过例子,这里不再重复。
3.2 for循环配合range实现定时任务
for配合range关键字,对定的time ticker循环读。读到就执行,是不是开一个定时任务很是方便与简洁呢?请看下面代码:
interval := time.Duration(10)
ticker := time.NewTicker(interval * time.Second)
for range ticker.C {
fmt.Println("timed")
}
3.3 for循环无限循环配合select实现一个goroutine管理多个chan通信
这个涉及到chan和goroutine,这里只是举个片段例子,让大家看看样子。后面遇到再详细解读:
ticker := time.NewTicker(taskTime * time.Second)
resNum := 0
for {
select {
case <-taskResChan:
resNum++
if resNum == taskNum {
fmt.Println("All tasks completed")
return
}
case <-ticker.C:
fmt.Println("recv timed, quit")
return
}
}
对这个例子先做一个解释,意思就是我有taskNum个工作线程,分别负责各自的工作,如果完成了就给主线程发一个信号。主线程收到信号发现全部完成就退回程序,如果没有完成,但是定时时间到了,也退出程序。
四、switch语句的语法
语法如下:
switch 条件{
case 条件1:
执行语句1
case 条件2,条件3,条件4:
执行语句2
default:
执行语句3
}
五、switch语句的注意事项
有以下几点注意事项:
- switch关键必须与左花括号在同一行
- 单case可以有多个条件,使用逗号分开
- case后面不需要break关键,GO语言是默认的。而C++中需要开发者自己写明。
- swithc后面的条件可以省略。case后面就可以跟上具体的表达式,这时与if的作用是一样的。
- default是所有条件不满足时才执行。
六、for循环与switch语句举例
直接上代码:
func anyToString(data any) (res string) {
switch data.(type) {
case int:
res = strconv.FormatInt(int64(data.(int)), 10)
case int32:
res = strconv.FormatInt(int64(data.(int32)), 10)
case int64:
res = strconv.FormatInt(data.(int64), 10)
case string:
res = data.(string)
case float32:
res = strconv.FormatFloat(float64(data.(float32)), 'g', -1, 32)
}
return res
}
func main() {
anyMap := map[int]any{}
anyMap[1] = int(1)
anyMap[2] = "12345"
anyMap[3] = 3.1425
for _, v := range anyMap {
fmt.Println(anyToString(v))
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)