GO語言基礎教程:流程控制

在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼:

package main
    import (
        "fmt"
    )
    func main(){
        var x,y int=1,2
        {
            var x int=2
            {
                var x int=3
                fmt.Println(x,y)    //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何?
            }
            fmt.Println(x,y)        //其次輸出2,2
        }
        fmt.Println(x,y)            //最後輸出1,2
    }

執行結果我已經加到註釋內了,其實沒必要好奇,GO語言就是如此,這種突然出現的大括號構成了複合語句,大括號內的變量作用範圍只能在變量內部,這就涉及到變量的作用域了,在PHP中變量也是有作用域的,但是PHP遇到這種突然出現的大括號時不會構成這種複合語句,因此也就不會影響到變量的作用域,這一點請謹記
    其次我們在PHP中的function內使用全局變量的時候通常要用global把全局變量引入進來,但是在GO語言中不需要那麼麻煩,全局變量如果出現在function前邊就可以直接在function內使用,而不需要額外的描述,在GO語言中,全局變量的作用範圍是當前的package,局部變量的作用域被限制到了其所在的大括號內.

上一篇文章我在介紹數據類型的時候有提到一個數據類型轉換的部份,在此跟大家說一下GO語言是如何轉換數據類型的.
    首先我們要清楚,GO語言是類型安全的,它不允許數據類型隱式轉換否則會造成精度丟失,在go語言中所有的類型轉換必須要顯式進行才可以.
    其顯式轉換方法其實非常簡單
    變量1=<變量1的類型>(<變量2>)
    例如:
    v1:=3.14
    var v2 int
    v2=int(v1)
    上例我把浮點型的v1顯式轉換成了int型.此時v2的值是3
    在顯式轉換的時候有幾點需要注意一下:
    int型可以轉為float型
    float型可以轉為int型
    string型可以轉為[]byte和[]int型
    []byte可以轉為string型
    []int可以轉為string型
    除此之外別的都不可以.
    這樣的類型轉換可以保障變量的類型是安全的,不會像PHP那樣類型被偷偷轉換了,例如:
    var_dump("5"+"0");
    這句代碼按理說應該是兩個string串接輸出string("50")才對,但是PHP的隱式轉換把他的類型給改了,變成了int(5),這種狀況在GO語言中是不會發生的.
    除了這種類型轉換方式之外GO語言還提供了一個標準的package用來對數據類型進行轉換,這個package的名字是strconv,它提供的方法有:
    Atoi(字符串) (bool,error)       接收字符串參數轉為Int型
    Itoa(Int型) (bool)              接收Int型參數轉為字符串
    FormatBool(bool) string             接收布爾參數轉為string型
    FormatFloat(float64,浮點格式,輸出精度,[位數32,64]) string       接收布爾參數轉為string型
    FormatInt(int64,[進制2,8,10,16]) string     接收int型參數根據進制轉為string型
    FormatUint(int64,[進制2,8,10,16]) string        同上,接收無符號int型參數根據進制轉為string型
    ParseBool(字符串) (bool,error)      接收字符串參數轉為bool型
    ParseFloat(字符串,[位數32,64]) (bool,error)     接收字符串參數轉為Float型
    ParseInt(字符串,[進制2,8,10,16],[位數0,8,16,32,64]) (bool,error)        接收字符串參數轉為Int型
    ParseUint(字符串,[進制2,8,10,16],[位數0,8,16,32,64]) (bool,error)       同上,接收字符串參數轉為無符號Int型

這些方法在進行數據類型轉換的時候也是非常有用的,需要格外注意一下.

那麼接下來的時間我們就主要介紹一下GO語言的流程控制,這個部份主要涉及到if;switch;和循環,
    首先我們來看一下if部份.首先我們看一下下邊這段代碼:

var a int
    a=xx()
    if a==1{
        fmt.Println("1")
    }else if a==2{
        fmt.Println("2")
    }else{
        fmt.Println("其他")
    }

通過上邊的代碼不難發現其實GO語言的if寫法和別的編程語言幾乎沒有差別,但是要注意一點,那就是條件語句不能出現小括號,還有就是左大括號必須要出現在判斷語句的尾部,不能寫到新的一行.就像上邊的這個demo就不能這樣寫:

var a int
    a=xx()
    if(a==1)                //這是第一個錯誤
    {                       //這是第二個錯誤
        fmt.Println("1")
    }
    注意一下這兩點就差不多了,除了上邊說的這個注意事項之外還有一點需要注意的地方,請看下邊的代碼:
    if a:=xx();a==1{
        fmt.Println("1")
    }
    fmt.Println(a)          //這是錯誤的,因為變量a屬於if的區域變量

在這個demo中變量a被放到了if同一行中,此時a就屬於這個if的區域變量
    總結一下,在GO語言中if在使用的時候要注意三點就足够了,分別是:1.條件語句不能有小括號,2.左大括號必須要放到語句的結尾,3.其他語句可以放到提交語句的左側,此時若有給變量賦值,那麼這個變量的作用範圍被局限在if內

接下來我們看一下GO語言的switch用法,首先我們來看一下下邊的代碼:

var a int
    a=xx()
    switch a{
        case 1:
            fmt.Println("1")
        case 2,3:
            fmt.Println("2或3")
        case 4:
            fmt.Println("4")
            fallthrough
        case 5:
            fmt.Println("5")
        default:
            fmt.Println("其他")
    }
    fmt.Println("結束")

在上邊的這個demo中如果您仔細看的話您會發現GO語言的switch用法和其他語言差異不大,但是每一個case都沒有break,這是因為GO語言默認情況下是不需要加break的,在上邊的例子中如果a的值等於1,那麼會輸出"1結束",看到沒有根本就不需要加入break就能自動跳出switch,那麼如果當a的值等於4的時候會輸出"45結束",這是因為fallthrough的緣故,fallthrough可以讓case能夠被穿越,初次之外GO語言的switch還有一種更高級的用法,至少這種用法以前我沒有在其他語言中見過,這種用法讓switch可以當if用,看下邊的demo:

a:=xx()
    switch {                    //左大括號必須要和switch同一行
        case a<0:
            fmt.Println("負數")
        case (a>0) && (a<=10):
            fmt.Println("1-10")
        case (a>10) && (a<=20):
            fmt.Println("11-20")
        default:
            fmt.Println("其他")
    }

看上邊的例子,在switch后沒有了判斷語句,而判斷語句被拿到了case後邊,這就是我上邊所講的switch拿來當if用.
    那麼我們來總結一下switch的注意事項吧:1.左大括號必須要和switch同一行,2.不需要使用break跳出case,3.如果需要穿透case就必須要加fallthrough,4.可以不加判斷語句把其當if來用.

最後我們說一下GO語言的循環,在GO語言中只有一個for用來循環,其他語言中常見的white;do..while;do..loop;foreach;while等循環方式都沒了,這一系列亂七八糟的循環方式在GO語言中只需要for就足够了.接下來我們通過幾個demo來逐一講解for是怎麼做到這些的.看代碼

for i:=0;i<10;i++{      //注意不要加小括號,左大括號必須要在同一行
        fmt.Println(i)
    }

這是常見的一種用法了,除了不要加小括號和左大括號必須要出現在行尾之外,跟別的編程語言沒有任何差異,因此針對這種循環方式我就不再細說了.接下來我們看第二種用法:

i:=0
    for ;i<10;i++{
        fmt.Println(i)
    }
    fmt.Println("繼續輸出:",i)

在這個例子中變量i被拿到了for循環之外定義,所以在for上我就不需要在對其進行額外的定義動作了,只需要一個分號就够了,等到for循環結束之後我還可以輸出變量i的值,因為此時的變量不再專屬於for.再接著看

 i:=0
    for i<10{
        fmt.Println(i)
        i++
    }
    fmt.Println("繼續輸出:",i)

在這個例子中第三個條件語句也沒了,被我拿到了for內部,所以我就可以把條件語句中的分號都給省略掉.是不是很有意思,其實這就已經能夠取代while了.或許您還感覺不過癮,那好接下來我們弄個更狠的

 i:=0
    for {
        if i>10{
            break
        }
        fmt.Println(i)
        i++
    }
    fmt.Println("繼續輸出:",i)

看到沒,do..loop或do..while之類的都被取代了.用這種循環方式時要注意控制跳出循環,要不然的話弄個死循環就不好了.啥你不知道怎麼寫死循環?好吧

for {
        fmt.Println("我是死循環")
    }

看到沒就是這麼簡單就死循環了.如果您不信您可以自己執行試試就知道效果了.最后就只剩下foreach寫法了,看下邊的例子

 i:=[]string{"aa","bb","cc"}
    for k,v:=range i{
        fmt.Println(k,v)
    }

通過這段代碼就能把數組的鍵名和值給逐行輸出

接下來我們來總結一下GO語言的for循環需要注意的事項:1.條件語句不能加小括號,左大括要和for在同一行,2.如果條件語句超過兩個,則分號不能省略
    另外for循環會涉及到break和continue的用法,如有不懂的朋友可以自己上網搜一下,這個比較簡單在此我就不再贅述了.
    還有就是GO語言加了goto,說實話我很不建議大家用,在此順便一提,有興趣的朋友可以自己研究一下.

希望轉載文章的朋友能夠留一個文章出處,http://see7di.cnblogs.com 在此感激不盡!

剛成立了一個QQ群,有興趣討論GO語言的朋友可以加入:195112

GO語言基礎教程:流程控制

时间: 2024-08-03 07:11:41

GO語言基礎教程:流程控制的相关文章

GO語言基礎教程:數據類型,變量,常量

GO類似PHP,每行的結尾要加分號來結束,不同點在於GO對此並不強制,這一點又像javascript,另外GO的語句塊是用一對大括號來包裹的,但是go要求左大括號必須要在語句的結尾處,不能在行首出現左大括號,這是一個新的特性,至少在我接觸的編程語言中第一次遇到這種狀況.還有就是GO對大小寫敏感,這一點相信大家不會有什麽爭議.    GO語言的註釋方法和PHP是相同的,單行註釋用//,而多行註釋用/*註釋內容*/,這一點是沒差別的. Go有眾所周知的數據類型int,這個類型很特殊,他會自動根據您的

GO語言基礎教程:Hello world!

首先簡單地說一下GO語言的環境安裝,從 http://golang.org/dl/ 針對自己的操作系統選擇合適的安裝包,然後下載安裝即可,下載的時候注意別選錯了的操作系統,例如go1.3.1.darwin-386-osx10.6.tar.gz 這個是蘋果操作系統的安裝包,go1.3.1.linux-amd64.tar.gz 這個是64位linux的安裝包,go1.3.1.windows-amd64.msi 這個是64位windows系統的安裝包,安裝過程很簡單,參照說明一步一步進行即可,在此不再

GO語言基礎教程:序章

首先自我介紹一下我自己,我是一個coder,目前主要從事B/S程序開發工作,懂點PHP;ASP;JSP;JS;VB;C;DELPHI;JAVA,另外知道幾個數據庫,除此之外別無所長,那麼我為何會選擇學習GO呢!接下來我對此詳細說明一下. 首先我來說明一下C/S程序和B/S程序的優缺點: C/S程序主要是運行在客戶端的電腦上,通常採用安裝的形式,以windows操作系統為例,軟件會被編譯成二進制然後以exe或dll等方式存在於客戶端的電腦上,其執行效率是非常高的,當然了除非編程者把代碼寫的非常糟糕

GO語言基礎教程:array,slice,map

這節課我們來講解數組,切片和map,或許您是從其他語言轉到GO語言這邊的,那麼在其他語言的影響下您可能會不太適應GO語言的數組,因為GO語言把數組給拆分成了array,slice和map,接下來的時間讓我們一起研究一下這三者的差異以及用法.首先我們說一下array的部份: 1.數組的長度屬於數組的一部份,我們看下邊的例子 a:=[1]int{}和b:=[2]int{} a和b都是數組,但是他們的長度不同,在GO語言中會認為是不同的兩種類型,既然是不同的類型,那麼他們就不能進行比較或直接賦值的操作

Visual Basic快捷教程——流程控制

美籍匈牙利数学家冯·诺依曼于1946年提出"程序存储,顺序执行"的观念,为现代计算机奠定了重要基础.这一观点认为:应该把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存.电子计算机的数制宜采用二进制:计算机应该按照程序顺序执行.所以现在开发人员在编写的程序代码时,其实都隐含地认为计算机将来会一行一行按顺序来执行这些指令.但是在顺序执行的过程中,有时我们希望计算机根据条件判断来选择性地执行(或者不执行)一些代码--这时就需要用到选择结构(或称分支结构).另外一些时候,我们希

Swift中文教程(三)--流程控制

原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制语句和循环语句中,小括号是可选的,但花括号包住这个循环体是必须的: 1 let individualScores = [75, 43, 103, 87, 12] 2 var teamScore = 0 3 for score in individualScores { 4 if score > 50 { 5 teamScore += 3

云计算开发教程:Python自动化运维开发实战流程控制

今天这篇文章是给大家分享一些云计算开发教程,今天讲解的是:Python自动化运维开发实战流程控制. Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句-- else: 执行语句-- 其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范

Shell入门教程:流程控制(1)命令的结束状态

在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环”.不管是哪一种,均需进行条件测试,再根据测试结果,决定程序流程进行的方向. 以下逐一说明这些命令的用法. 第一节:命令的结束状态 Bash Shell Script 可由许多命令组成.每一个命令执行后,都会传回一个结束状态值,如果执行成功,传回0,如果执行失败,则传回非0值.执行失败,也分成许多状

mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制

事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚.所有受到影 响的数据将返回到事物开始以前的状态:如果单元中的所 有SQL语句均执行成功,则事物被顺利执行. 存储引擎 概念 在mysql中的数据用各种不同的技术存储 在文件(或内存)中. 查看 通过 show engines: 来查看mysql支持的存储引擎. 常见引擎 在mysql中用的