当前位置: 首页 > news >正文

《快学 Go 语言》第 3 课 —— 分支与循环

程序 = 数据结构 + 算法

上面这个等式每一个初学编程的同学都从老师那里听说过。它并不是什么严格的数据公式,它只是对一般程序的简单认知。数据结构是内存数据关系的静态表示,算法是数据结构从一个状态变化到另一个状态需要执行的机器指令序列。数据结构是静态的,算法是动态的。数据结构是状态,算法是状态的变化。

5e1059e8961a754a6e5cf44d9685df07b602b423图片


上一节我们讲的变量,它是数据结构的最小单位,本节我们要讲的分支与循环,它是算法逻辑的最小单位。

Go 语言的分支循环语句选择性较少,循环语句它只有 for 循环,平时我们在其它语言用的 while 语句、do while 语句、loop 语句它是没有的。分支语句只有 if 和 switch,也没有三元操作符。

少并不是坏事,够用就行。语法糖丰富了表面上选择性多了功能强大了,但是也会增加代码的理解成本,用户需要掌握更多的知识才可以理解代码,这会提高语言的学习门槛。一个经验丰富的编程老鸟总是会倾向于用最简单的代码来写出易于理解的程序来,偏方窍门奇技淫巧那是初学者膜拜的对象。

快学 Go 语言 第 1 课 —— Hello World

快学 Go 语言 第 2 课 —— 变量基础

if else 语句

下面我们使用 if else 语句编写一个最大函数 max 、最小函数 min 和 正负符号函数 sign。这个例子中我们要第一次引入用户自定义的函数。

package main

import "fmt"

func main() {
fmt.Println(sign(max(min(24, 42), max(24, 42))))
}

func max(a int, b int) int {
if a > b {
return a
}
return b
}

func min(a int, b int) int {
if a < b {
return a
}
return b
}

func sign(a int) int {
if a > 0 {
return 1
} else if a < 0 {
return -1
} else {
return 0
}
}

------------
1

如果是其它语言,这种最大最小函数我们一般会使用三元操作符 a>b?a:b 一条语句搞定,不过 Go 语言没有三元操作符,这里只能使用 if 语句,这里有那么点让人不爽。
我们还需要注意到 if else 语句的条件居然不需要括号扩起来,有一种不穿上衣逛街的感觉。这个也是读者们需要适应的地方,不单是 if else 语句的条件不需要括号,for 循环的条件也不需要括号,习惯就好!

switch 语句

哪种语言没有 switch 语句?我所知道的只有 Python 语言,在 Python 里面你需要编写很多的 if else 分支语句来达到 switch 的效果。Go 语言提供了 switch 语句,下面我们使用 switch 语句来编写一个简单的评分函数。switch 有两种匹配模式,一种是变量值匹配,一种是表达式匹配。

package main

import "fmt"

func main() {
fmt.Println(prize1(60))
fmt.Println(prize2(60))
}

// 值匹配
func prize1(score int) string {
switch score / 10 {
case 0, 1, 2, 3, 4, 5:
return "差"
case 6, 7:
return "及格"
case 8:
return "良"
default:
return "优"
}
}

// 表达式匹配
func prize2(score int) string {
// 注意 switch 后面什么也没有
switch {
case score < 60:
return "差"
case score < 80:
return "及格"
case score < 90:
return "良"
default:
return "优"
}
}

switch 还支持特殊的类型匹配语法,这个我们要放到后续章节来讲解。

for 循环

Go 语言虽然没有提供 while 和 do while 语句,不过这两个语句都可以使用 for 循环的形式来模拟。我们平时使用 while 语句来写死循环 while(true) {},Go 语言可以这么写

package main

import "fmt"

func main() {
for {
fmt.Println("hello world!")
}
}

也可以这样写,效果是一样的

package main

import "fmt"

func main() {
for true {
fmt.Println("hello world!")
}
}

for 什么条件也不带的,相当于 loop {} 语句。for 带一个条件的相当于 while 语句。for 带三个语句的就是普通的 for 语句。

package main

import "fmt"

func main() {
for i := 0; i < 10; i++ {
fmt.Println("hello world!")
}
}

for 语句配合 range 关键字还能玩出更多新花样,这个我们会在后面章节陆续讲解

循环控制

Go 语言支持 continue 和 break 语句来控制循环,这两个语句和其它语言没什么特殊的区别。除此之外 Go 语言还支持 goto 语句。计算机科学家迪杰斯特拉很讨厌 goto 语句,他的那片广为流传的论文《Goto 有害》已经家喻户晓般地为人所知,可是他已经去世这么多年了,很遗憾还是没能阻挡 goto 语句死灰复燃般地继续存在。

7e4a16e475d76bcdd96076b6353a70d6aadcd3a3图片


我们作为普通用户平时还是尽量不要使用 goto 语句了,不论是谁来 review 你的代码只要是看到了 goto 语句肯定会发发牢骚的。


下一节我们开讲 Go 语言重要的特殊数据类型 —— 数组与切片


原文发布时间为: 2018-11-13
本文作者:码洞
本文来自云栖社区合作伙伴“码洞”,了解相关信息可以关注“码洞”。

相关文章:

  • spark中的动态executor分配
  • zeroclipboard无法正常使用的解决办法
  • Sublime Text 2 安装Package Control和插件的两种方法
  • SpringBoot整合RabbitMQ之典型应用场景实战一
  • MetaMask/provider-engine-3-test
  • Http长连接200万尝试及调优
  • 压缩图片C#算法
  • SSM框架pom.xml的配置
  • unrecognized import path golang.org/x/sync
  • 〔开发系列〕一次关于小程序开发的深度总结
  • [译]2.1-Key-Value Coding Programming Guide 官方文档第二部分
  • Oracle 11g win32位 window7下安装教程
  • C++容器
  • 区块链软件:谈溯源问题
  • nginx动静分离之后,设置默认主页
  • .pyc 想到的一些问题
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • gcc介绍及安装
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Leetcode 27 Remove Element
  • Linux链接文件
  • Python - 闭包Closure
  • ReactNative开发常用的三方模块
  • WePY 在小程序性能调优上做出的探究
  • 电商搜索引擎的架构设计和性能优化
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 简单数学运算程序(不定期更新)
  • 类orAPI - 收藏集 - 掘金
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 思维导图—你不知道的JavaScript中卷
  • 系统认识JavaScript正则表达式
  • 协程
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 源码安装memcached和php memcache扩展
  • 在Unity中实现一个简单的消息管理器
  • scrapy中间件源码分析及常用中间件大全
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 移动端高清、多屏适配方案
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (zt)最盛行的警世狂言(爆笑)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)负载均衡,回话保持,cookie
  • .gitattributes 文件
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net访问oracle数据库性能问题
  • @Autowired标签与 @Resource标签 的区别
  • @NoArgsConstructor和@AllArgsConstructor,@Builder