程序员的知识教程库

网站首页 > 教程分享 正文

每天2分钟学习GO语言编程(八)for循环与switch语句

henian88 2024-08-16 17:31:53 教程分享 18 ℃ 0 评论

最近有朋友说,我这个系列教程写好了就不再更新和改变了,不如去官网自己看文档,这点我不反对,还非常的赞同。我出这个系列教程也是出于是GO语言的喜欢,所以趁着此机会自己也可以系统的再过一遍GO语言。我希望它变得更好。可以把我这个GO语言系列的当成是一个试金石,敲门砖,算是抛砖引玉吧,先大概看下是不是喜欢和适合。如果非常感兴趣,那就可以继续跟我这个教程,或者去官网看文档就更专业,我也不反对,因为这与我的目标是一致的,非常感谢朋友的建议。

活到老学到老,学海无涯,学无止境,我发现做了这么久的技术了,我仍然是井底之蛙,做技术还不懂的还有很多很多,朋友们一起共勉,努力学习。下面开始今天的分享。这一期分享一下for循环与switch语句,本期分为以下几个部分:

  1. for循环的语法
  2. for循环的注意事项
  3. for循环几种常用方式
  4. switch语句的语法
  5. switch语句的注意事项
  6. 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))
	}
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表