日期:2014年7月21日

 
一、控制结构
 
1、Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语句,另外Go中还提供了类型选择和多路通信转接器的select。Go的控制结构的语法和C相比有所不同,它不需要圆括号,但语句体必须总是包含在大括号内。
 
2、控制结构语法
1)if-else
    (1)if后紧跟单个条件
    例如:if x > 0 {   //{必须和if在同一行,这是Go语法规定的,如果换行写,编译就会报错
                   return y
               } else {
                   return x
               }
    (2)if后接受初始化语句
     例如: m1:=7
                 if n1:=9; n1 >= m1 {
                        fmt.Print("n1 >= m1")
                  }
    (3)if后紧跟逻辑运算符
      例如:if true && true {
                       fmt.Println("true")
                 }
     if语句体中,语句体结束于break、continue、goto、return,这和其它语言没什么区别。
 
2)goto
    Go中支持goto语句,不过使用的时候要多加小心。
    例如:
     func gotodemo() (string){
        i := 0
    GoToHere:   //这是函数内定义的标签,注意,它是区分大小写的。
        if i >= 5 {
            return "OK"
        }
        fmt.Println(i)
        i++
        goto GoToHere  //goto跳转至函数定义的标签处
    }
 
3)for
    Go语言中,for控制结构的功能相对来说较为强大,它可以完成C语言中for的功能,也能完成while的功能,当然我并不知道这门语言的设计者为什么要改变我们在其它语言中的通用性的使用习惯,但我觉得我喜欢这种风格,少即是多,如果能通过一个关键字来实现多种效果,又何必多增加一个关键字呢?Google对Go语言的设计思路和其本身遵从“更少点=简单”的理念是一致的。
    for循环的三种形式:
    (1)for init ; condition ; post {}  //同C中的for
    (2)for condition {} //同while
    (3)for {} //死循环
 
4)break和continue
    break用来终止循环,continue用来终止当前循环
    例如:
    func breakdemo() {
        for i := 0; i < 10 ; i++ {
            if i > 5 {
                break //整个循环终止
            }
            fmt.Println(i)
        }
 
        Tag:for i := 0; i < 10 ; i++ {
            if i > 10 {
                break Tag //终止标签名为Tag的循环
            }
            fmt.Println(i)
        }
    }
    func continuedemo() {
        for i := 0; i < 10 ; i++ {
            if i == 2 {
                continue
                fmt.Println("after continue")  //不会执行
            }
            fmt.Println("continue")
        }
    }
 
5)range
range可以用于循环,range 是个迭代器,当被调用的时候,从它循环的内容中返回一个键值对,基于 不同的内容,range 返回不同的东西。
例如:
   func rangedemo() {
        list := [] string { "a", "b", "c" }
        for k, v := range list { //用 range 对其进行循环。每一个迭代,range 将返回 int 类型的序号,string 类型的值
            fmt.Print("k=")
            fmt.Println(k)
            fmt.Print("v=")
            fmt.Println(v)
        }
    }
打印:
k=0
v=a
k=1
v=b
k=2
v=c
当对 slice 或者 array 做循环时,range 返回序号作为键,这个序号对应的内容作为值。 上述循环中k值变化范围是0~2,v值的变化范围是"a"~"c"。
 
range还可以直接使用在字符串的遍历中,字符串被打散成独立的Unicode字符,例如:
        for pos,char := range "abcd" {
            fmt.Printf("character '%c' starts at byte position %d\n",char, pos)
        }
打印:
character 'a' starts at byte position 0
character 'b' starts at byte position 1
character 'c' starts at byte position 2
character 'd' starts at byte position 3
 
6)switch
Go的switch非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找 到匹配项,而如果 switch 没有表达式,它会匹配 true 。
例如:
    func switchdemo() {
        len := 4
        switch len {
        case 0:
            println("len=0")
        case 1:
            println("len=1")
            fallthrough
        case 2:
            println("len=2")
        case 3,4:
            println("len=3 or len=4")
        default:
            println("default")
        }
    }
现在,我们来对switch中len的值来进行分析:
(1)假如len := 0,打印结果:len=0
(2)假如len := 1,打印结果:len=1 
                                               len=2
         为什么不满足的case 2,也会执行呢?这是因为我们使用了fallthrough关键字,它会强制case 2中的语句得以执行。
(3)假如len := 3或len := 4,打印结果len=3 or len=4,case中多个条件的判断使用","隔开,各个条件之间的关系是"OR"的关系。
(4)假如len不是0~4中任何一个值,那么就会执行default条件中的语句,打印出:default。
 
二、内建函数
 
在Go中提供了少数内建函数,它们可以在不用导入任何包的情形下使用,下图中列出了Go中的内建函数:
内建函数的用途简介:
close :用于 channel 通讯。使用它来关闭 channel。 
delete :用于在 map 中删除实例。 
len 和 cap :可用于不同的类型,len 用于返回字符串、slice 和数组的长度。
new :用于各种类型的内存分配。
make :用于内建类型(map、slice 和 channel)的内存分配。
copy :用于复制 slice。参阅本章的 “slice”。 
append :用于追加 slice。参阅本章的 “slice”。 
panic 和 recover :用于异常处理机制。
print 和 println :是底层打印函数,可以在不引入 fmt 包的情况下使用。它们主要用于调试。 
complex、real 和 imag :全部用于处理 复数。有了之前给的简单的例子,不用再进一步讨论复数了。

Go语言学习笔记(三) [控制结构、内建函数]的更多相关文章

  1. Go语言学习笔记三: 常量

    Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...

  2. 【GO】GO语言学习笔记三

    7.数组: 几乎是最常用的数据类型了... 数组就是指一系列同一类型数据 的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数 组的长度. 常规的数组声明方法: ...

  3. c语言学习笔记三

    第三章,函数 字符串函数 //strcmp int my_strcmp(char *str1,char *str2) {   while(*str1 = = *str2)   /*不可用while(* ...

  4. [C语言学习笔记三]格式化输出和输入

    使用 printf 函数来输出,使用 scanf 函数来输入 在 printf 函数中使用变量,需要使用占位符代替. int 型一般存储整数,使用 %d 代替 long long int 型一般存储长 ...

  5. JavaScript--基于对象的脚本语言学习笔记(三)

    事件处理器 1.一个数据校验表单的例程 <html> <head> <title>js练习</title> <meta http-equiv=&q ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  9. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

随机推荐

  1. 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件

    对页面引用自定义控件后,通过绑定自定义事件,页面绑定子控件的事件,在子控件做了某些修改动作后,如何同步操作父页面的方法:下面我煮了个栗子,同学们可以来尝一尝试一试 a.aspx 引用 UserCont ...

  2. python 文件与数据格式化

    https://www.cnblogs.com/li-zhi-qiang/p/9269453.html       文件和数据格式化 https://www.cnblogs.com/li-zhi-qi ...

  3. poj 1050 最大子矩阵

    a11   a12   a13   a14   a15 a21   a22   a23   a24   a25 a31   a32   a33   a34   a35 a41   a42   a43  ...

  4. autium designer smart pdf一个小问题

    今天在使用ad的smart  pdf时遇到一个小问题  就是 使用的是AD17,生成PDF,PDF没有把芯片的引脚标号显示出来(还有其它的芯片也是一样的,但是奇怪的是:只有在原理图元器件右边的没有显示 ...

  5. Mysql函数大全以及存储过程、函数、触发器、游标等等

    https://www.cnblogs.com/slowlyslowly/p/8649430.html MySQL大全 存储过程: 基本语法 : create procedure sp_name([[ ...

  6. Azure Sphere–“Object reference not set to an instance of an object” 解决办法

    在开发Azure Sphere应用时,如果出现项目无法编译,出现“Object reference not set to an instance of an object”时,必须从下面两个方面进行检 ...

  7. 【备忘】EntityFramework 6 升级到 EntityFrameworkCore 注意点

    正在将一个 .net framework 4.5 的项目升级到 .net core 2.1,其中使用到了 EF6,经历了一些修改: 命名空间的变化基本上可以靠自动提示补充完整,不需要强记. DbQue ...

  8. java继承多态和抽象类接口

    一.继承 通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类).(1)继承的优点:    ①代码的可重用性:    ②父类的属性 ...

  9. 每天学点SpringCloud(六):Hystrix使用

    Hystrix是一个实现断路器模式的库.什么是断路器模式呢?就像我们家庭中的电闸一样,如果有那一处出现意外,那么电闸就会立刻跳闸来防止因为这一处意外而引起更大的事故,直到我们确认处理完那一处意外后才可 ...

  10. 《Java 多线程编程核心技术》- 笔记

    作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...