日期: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. EFLinq查询

    1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToList ...

  2. redis_简单动态字符串

    在redis中,C字符串(以'\0'结尾的字符数组)只用在一些无需对字符串值进行修改的地方,比如打印日志.其他情况,redis使用SDS - SimpleDynamicString 简单动态字符串,来 ...

  3. 处理Word文档中所有修订

    打开现有文档进行编辑 若要打开现有文档,您可以将 Word类实例化,如以下 using 语句所示. 为此,您可以使用Open(String, Boolean) 方法打开具有指定 fileName 的字 ...

  4. struts2 升级至2.3.32时访问页面报错 File "/struts-tags" not found

    Apache struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web 应用的开源MVC框架,主要提供两个版本框架产品: struts 1和str ...

  5. Delegate、Thread、Task、ThreadPool几种方式创建异步任务性能对比

    开始预测的结果是 Task>Delegate>ThreadPool>>Thread. (一)测试代码 static async Task<int> AsyncTas ...

  6. Android开发者的Anko使用指南(三)之资源

    添加依赖 dependencies { compile "org.jetbrains.anko:anko-commons:$anko_version" } Color 0xff00 ...

  7. Python小练习之判断一个日期是一年的第几天

    python练手遇到的一个问题写了个统一公式,不用麻烦的分各种类,如果有人测试出错误请评论通知. #分单双月 def dayNum(month,day,isLeap): if month % 2 != ...

  8. iOS开发之Alamofire源码解析

    今天博客中的Alamofire源码的版本是以3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是给本篇博客 ...

  9. web安全Wargame—Natas解题思路(1-26)

    前言: Natas是一个教授服务器端Web安全基础知识的 wargame,通过在每一关寻找Web安全漏洞,来获取通往下一关的秘钥,适合新手入门Web安全. 传送门~ 接下来给大家分享一下,1-20题的 ...

  10. Visual Studio 开发(二):VS 2017配置FFmpeg开发环境

    在上篇文章Visual Studio 开发(一):安装配置Visual Studio Code 中,我们讲了一下如何配置VS CODE,来编写和调试C的代码.如果你已经使用VS Code回顾和复习好C ...