1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Go 經(jīng)典入門系列 3:變量

        共 5459字,需瀏覽 11分鐘

         ·

        2020-12-01 16:43

        點擊上方藍(lán)色“Go語言中文網(wǎng)”關(guān)注,每天一起學(xué) Go

        這是我們 Golang 系列教程的第 3 個教程,探討 Golang 里的變量(Variables)。

        你可以閱讀 Golang 系列教程第 2 部分:Hello World,學(xué)習(xí)如何配置 Golang,并運行 hello world 程序。

        變量是什么

        變量指定了某存儲單元(Memory Location)的名稱,該存儲單元會存儲特定類型的值。在 Go 中,有多種語法用于聲明變量。

        聲明單個變量

        var name type 是聲明單個變量的語法。

        package?main

        import?"fmt"

        func?main()?{
        ????var?age?int?//?變量聲明
        ????fmt.Println("my?age?is",?age)
        }

        在線運行程序[1]

        語句 var age int 聲明了一個 int 類型的變量,名字為 age。我們還沒有給該變量賦值。如果變量未被賦值,Go 會自動地將其初始化,賦值該變量類型的零值(Zero Value)。本例中 age 就被賦值為 0。如果你運行該程序,你會看到如下輸出:

        my?age?is?0

        變量可以賦值為本類型的任何值。上一程序中的 age 可以賦值為任何整型值(Integer Value)。

        package?main

        import?"fmt"

        func?main()?{
        ????var?age?int?//?變量聲明
        ????fmt.Println("my?age?is",?age)
        ????age?=?29?//?賦值
        ????fmt.Println("my?age?is",?age)
        ????age?=?54?//?賦值
        ????fmt.Println("my?new?age?is",?age)
        }

        在線運行程序[2]

        上面的程序會有如下輸出:

        my?age?is??0
        my?age?is?29
        my?new?age?is?54

        聲明變量并初始化

        聲明變量的同時可以給定初始值。

        var name type = initialvalue 的語法用于聲明變量并初始化。

        package?main

        import?"fmt"

        func?main()?{
        ????var?age?int?=?29?//?聲明變量并初始化

        ????fmt.Println("my?age?is",?age)
        }

        在線運行程序[3]

        在上面的程序中,age 是具有初始值 29 的 int 類型變量。如果你運行上面的程序,你可以看見下面的輸出,證實 age 已經(jīng)被初始化為 29。

        my?age?is?29

        類型推斷(Type Inference)

        如果變量有初始值,那么 Go 能夠自動推斷具有初始值的變量的類型。因此,如果變量有初始值,就可以在變量聲明中省略 type。

        如果變量聲明的語法是 var name = initialvalue,Go 能夠根據(jù)初始值自動推斷變量的類型。

        在下面的例子中,你可以看到在第 6 行,我們省略了變量 ageint 類型,Go 依然推斷出了它是 int 類型。

        package?main

        import?"fmt"

        func?main()?{
        ????var?age?=?29?//?可以推斷類型

        ????fmt.Println("my?age?is",?age)
        }

        在線運行程序[4]

        聲明多個變量

        Go 能夠通過一條語句聲明多個變量。

        聲明多個變量的語法是 var name1, name2 type = initialvalue1, initialvalue2。

        package?main

        import?"fmt"

        func?main()?{
        ????var?width,?height?int?=?100,?50?//?聲明多個變量

        ????fmt.Println("width?is",?width,?"height?is",?heigh)
        }

        在線運行程序[5]

        上述程序?qū)⒃跇?biāo)準(zhǔn)輸出打印 width is 100 height is 50

        你可能已經(jīng)想到,如果 width 和 height 省略了初始化,它們的初始值將賦值為 0。

        package?main

        import?"fmt"

        func?main()?{
        ????var?width,?height?int
        ????fmt.Println("width?is",?width,?"height?is",?height)
        ????width?=?100
        ????height?=?50
        ????fmt.Println("new?width?is",?width,?"new?height?is?",?height)
        }

        在線運行程序[6]

        上面的程序?qū)蛴。?/p>

        width?is?0?height?is?0
        new?width?is?100?new?height?is??50

        在有些情況下,我們可能會想要在一個語句中聲明不同類型的變量。其語法如下:

        var?(
        ????name1?=?initialvalue1,
        ????name2?=?initialvalue2
        )

        使用上述語法,下面的程序聲明不同類型的變量。

        package?main

        import?"fmt"

        func?main()?{
        ????var?(
        ????????name???=?"naveen"
        ????????age????=?29
        ????????height?int
        ????)
        ????fmt.Println("my?name?is",?name,?",?age?is",?age,?"and?height?is",?height)
        }

        在線運行程序[7]

        這里我們聲明了 string 類型的 name、int 類型的 age 和 height(我們將會在下一教程中討論 golang 所支持的變量類型)。運行上面的程序會產(chǎn)生輸出 my name is naveen , age is 29 and height is 0。

        簡短聲明

        Go 也支持一種聲明變量的簡潔形式,稱為簡短聲明(Short Hand Declaration),該聲明使用了 := 操作符。

        聲明變量的簡短語法是 name := initialvalue

        package?main

        import?"fmt"

        func?main()?{
        ????name,?age?:=?"naveen",?29?//?簡短聲明

        ????fmt.Println("my?name?is",?name,?"age?is",?age)
        }

        在線運行程序[8]

        運行上面的程序,可以看到輸出為 my name is naveen age is 29

        簡短聲明要求 := 操作符左邊的所有變量都有初始值。下面程序?qū)伋鲥e誤 cannot assign 1 values to 2 variables,這是因為 age 沒有被賦值。

        package?main

        import?"fmt"

        func?main()?{
        ????name,?age?:=?"naveen"?//error

        ????fmt.Println("my?name?is",?name,?"age?is",?age)
        }

        在線運行程序[9]

        簡短聲明的語法要求 := 操作符的左邊至少有一個變量是尚未聲明的??紤]下面的程序:

        package?main

        import?"fmt"

        func?main()?{
        ????a,?b?:=?20,?30?//?聲明變量a和b
        ????fmt.Println("a?is",?a,?"b?is",?b)
        ????b,?c?:=?40,?50?//?b已經(jīng)聲明,但c尚未聲明
        ????fmt.Println("b?is",?b,?"c?is",?c)
        ????b,?c?=?80,?90?//?給已經(jīng)聲明的變量b和c賦新值
        ????fmt.Println("changed?b?is",?b,?"c?is",?c)
        }

        在線運行程序[10]

        在上面程序中的第 8 行,由于 b 已經(jīng)被聲明,而 c 尚未聲明,因此運行成功并且輸出:

        a?is?20?b?is?30
        b?is?40?c?is?50
        changed?b?is?80?c?is?90

        但是如果我們運行下面的程序:

        package?main

        import?"fmt"

        func?main()?{
        ????a,?b?:=?20,?30?//?聲明a和b
        ????fmt.Println("a?is",?a,?"b?is",?b)
        ????a,?b?:=?40,?50?//?錯誤,沒有尚未聲明的變量
        }

        在線運行程序[11]

        上面運行后會拋出 no new variables on left side of := 的錯誤,這是因為 a 和 b 的變量已經(jīng)聲明過了,:= 的左邊并沒有尚未聲明的變量。

        變量也可以在運行時進(jìn)行賦值??紤]下面的程序:

        package?main

        import?(
        ????"fmt"
        ????"math"
        )

        func?main()?{
        ????a,?b?:=?145.8,?543.8
        ????c?:=?math.Min(a,?b)
        ????fmt.Println("minimum?value?is?",?c)
        }

        在線運行程序[12]

        在上面的程序中,c 的值是運行過程中計算得到的,即 a 和 b 的最小值。上述程序會打印:

        minimum?value?is??145.8

        由于 Go 是強(qiáng)類型(Strongly Typed)語言,因此不允許某一類型的變量賦值為其他類型的值。下面的程序會拋出錯誤 cannot use "naveen" (type string) as type int in assignment,這是因為 age 本來聲明為 int 類型,而我們卻嘗試給它賦字符串類型的值。

        package?main

        func?main()?{
        ????age?:=?29??????//?age是int類型
        ????age?=?"naveen"?//?錯誤,嘗試賦值一個字符串給int類型變量
        }

        在線運行程序[13]

        感謝您的閱讀,請在評論欄上面發(fā)布您的問題和反饋。

        上一教程 - Hello World[14]

        下一教程 - 類型[15]


        via: https://golangbot.com/variables/

        作者:Nick Coghlan[16]譯者:Noluye[17]校對:Unknwon[18]

        本文由 GCTT[19] 原創(chuàng)編譯,Go 中文網(wǎng)[20] 榮譽(yù)推出

        參考資料

        [1]

        在線運行程序: https://play.golang.org/p/XrveIxw_YI

        [2]

        在線運行程序: https://play.golang.org/p/z4nKMjBxLx

        [3]

        在線運行程序: https://play.golang.org/p/TFfpzsrchh

        [4]

        在線運行程序: https://play.golang.org/p/FgNbfL3WIt

        [5]

        在線運行程序: https://play.golang.org/p/4aOQyt55ah

        [6]

        在線運行程序: https://play.golang.org/p/DM00pcBbsu

        [7]

        在線運行程序: https://play.golang.org/p/7pkp74h_9L

        [8]

        在線運行程序: https://play.golang.org/p/ctqgw4w6kx

        [9]

        在線運行程序: https://play.golang.org/p/wZd2HmDvqw

        [10]

        在線運行程序: https://play.golang.org/p/MSUYR8vazB

        [11]

        在線運行程序: https://play.golang.org/p/EYTtRnlDu3

        [12]

        在線運行程序: https://play.golang.org/p/7XojAtrpH9

        [13]

        在線運行程序: https://play.golang.org/p/K5rz4gxjPj

        [14]

        Hello World: https://studygolang.com/articles/11755

        [15]

        類型: https://studygolang.com/articles/11869

        [16]

        Nick Coghlan: https://golangbot.com/about/

        [17]

        Noluye: https://github.com/Noluye

        [18]

        Unknwon: https://github.com/Unknwon

        [19]

        GCTT: https://github.com/studygolang/GCTT

        [20]

        Go 中文網(wǎng): https://studygolang.com/



        推薦閱讀


        福利

        我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號 「polarisxu」,回復(fù) ebook 獲?。贿€可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

        瀏覽 46
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91人妻少妇精品无码专区二区a91 | 逼逼爱插插视频 | 国产欧美一区二区三区四区 | 老子影院午夜伦不卡大全 | 欧美一级黄色大片 | 白峰美羽无码 | 成人在线综合豆花 | 啊好爽用力 | 任你躁久久久久久老妇 | 黄色日|