主要内容来自中文版的官方教程Go语言之旅

目的为总结要点

循环

Go 只有 for循环

for 由三部分组成,用分号间隔开

  • 初始化语句:在第一次迭代之前执行,通常为一句短变量声明(i:=0
  • 条件表达式:在每次迭代之前求值,一旦条件表达式的值是false循环终止
  • 后置语句:在每次迭代结束之后执行

for语言没有小括号,大括号是必须的。

package main

import "fmt"

func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
}

需要注意,for语句中声明的变量是局部变量,下面这个例子中省略了后置语句

package main

import "fmt"

func main() {
var sum int = 1
for sum := 10; sum < 1000; {
sum += sum //在这里改变sum并不会影响其他的外层的sum
fmt.Println(sum)
}
fmt.Println(sum)
}
// output 40 80 160 640 1280 1

将所有的分号去掉,可以直接当做while来使用,下面这个例子中省略了初始化语句和后置语句

package main

import "fmt"

func main() {
sum := 1
for sum < 1000 {
sum += sum
fmt.Println(sum)
}
fmt.Println(sum)
}
// output 2 4 8 16 32 64 128 256 512 1024 1024

如果只有for 那么代表无限循环,下面这个例子中省略了所有语句

package main

func main() {
for {
}
}

分支

Go也用if来表示分支,表达式无需小括号,必须大括号

func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}

for类似,if在条件表达式之前可以执行一个简单语句,该语句生命的变量作用于仅在if之内

func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
fmt.Println(v)
return v // 如果v 小于上界,返回v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// 这里开始就不能使用 v 了
return lim // 否则,返回上界
}

switch

C不同,Go之运行选定的case,不会接着运行之后所有的case,相当于自动提供了break。switch的case语句从上到下顺序求值,知道匹配成功为止

package main

import (
"fmt"
"runtime"
) func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os { // os 的取值不需要为常量,也不需要为整数
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
}

没有条件的switch默认为switch true,比如

package main

import (
"fmt"
"time"
) func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}

defer

defer 是一个关键字,以这个关键字开始的语句会将函数推迟到外层函数返回之后执行。

package main

import "fmt"

func main() {
defer fmt.Println("world") fmt.Println("hello")
} //output:
//hello
//world

推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。

package main

import "fmt"

func main() {
fmt.Println("counting") for i := 0; i < 10; i++ {
defer fmt.Println(i)
} fmt.Println("done")
}
//output
//counting
//done
//9
//8
//7
//6
//5
//4
//3
//2
//1
//0

Go 入门 - 控制流的更多相关文章

  1. swift:入门知识之控制流

    1.swift语句中的控制流和其他语言大致相同,使用if和switch作为条件控制.使用 for-in.for.while.do-while作为循环. 2.区别之处:小括号不是必须的,但是主体的大括号 ...

  2. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  3. Oozie 快速入门

    设想一下,当你的系统引入了spark或者hadoop以后,基于Spark和Hadoop已经做了一些任务,比如一连串的Map Reduce任务,但是他们之间彼此右前后依赖的顺序,因此你必须要等一个任务执 ...

  4. Swift语言快速入门

    Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著   ISBN 978-7-121-24328-8 201 ...

  5. 自学 Java 怎么入门

    自学 Java 怎么入门? 595赞同反对,不会显示你的姓名     给你推荐一个写得非常用心的Java基础教程:java-basic | 天码营 这个教程将Java的入门基础知识贯穿在一个实例中,逐 ...

  6. sass、less和stylus的安装使用和入门实践

    刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...

  7. Apple Swift编程语言入门教程

    Apple Swift编程语言入门教程 作者: 日期: 布衣君子 2015.09.22 目录 1   简介 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 ...

  8. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  9. 【转】c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...

随机推荐

  1. Redis入门实例(Redis+Sprint+maven创建工程)

    一.>创建一个maven工程应用和相关配置:Redis_study,创建工程应用过程略 1.>配置pom.xml:文件内容如下 <project xmlns="http:/ ...

  2. node-7.2.1 already installed, it's just not linked

    直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...

  3. java中的泛型2--注意的一些问题和面试题

    前言 这里总结一下泛型中需要注意的一些地方和面试题,通过面试题可以让你掌握的更清楚一些. 泛型相关问题 1.泛型类型引用传递问题 在Java中,像下面形式的引用传递是不允许的: ArrayList&l ...

  4. SOJ4480 Easy Problem IV (并查集)

    Time Limit: 3000 MS Memory Limit: 131072 K Description 据说 你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任 ...

  5. JSON解析问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/quanqinayng/article/details/25121955 这是data.chatFil ...

  6. php签到

    <?php namespace Member\Controller; use Member\Controller\MController; class IndexController exten ...

  7. 4.spring:@Profile,AOP

    Profile: 可以根据当前的环境,动态激活和切换一系列的组件功能 指定组件在那个环境下才能被注册到容器中,不指定任何环境下都能注册到 1.加了环境标识的bean只有环境激活的时候才能注册到容器中 ...

  8. MATLAB 中gcf、gca 以及gco 的区别

    MATLAB 中gcf.gca 以及gco 的区别gcf 返回当前Figure 对象的句柄值gca 返回当前axes 对象的句柄值gco 返回当前鼠标单击的句柄值,该对象可以是除root 对象外的任意 ...

  9. 使用CSV Data Set Config实现参数化登录

    在使用Jemeter做压力测试的时候,往往需要参数化用户名,密码以到达到多用户使用不同的用户名密码登录的目的.这个时候我们就可以使用CSV Data Set Config实现参数化登录: 首先通过Te ...

  10. 【Node.js学习笔记】使用Gulp项目自动化构建工具

    刚接触node.js,对前端的一些东西还不是很清楚,据说Gulp这东西很强大,先来看看从网上抄的一段关于自动化构建的描述: 在为数众多的中小型软件作坊中,不存在自动化构建和发布工具.构建.交付准备环境 ...