Go语言学习笔记(三) [控制结构、内建函数]

日期: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 :全部用于处理 复数。有了之前给的简单的例子,不用再进一步讨论复数了。

转载于:https://my.oschina.net/javagoboy/blog/387895

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值