變量

Golang是靜態(tài)類(lèi)型語(yǔ)言,不能在運(yùn)行期間改變變量類(lèi)型冲粤。

變量

var 語(yǔ)句定義了一個(gè)變量的列表美莫;跟函數(shù)的參數(shù)列表一樣,類(lèi)型在后面梯捕。

初始化變量

使用關(guān)鍵字 var 定義變量厢呵,自動(dòng)初始化為零值。如果提供初始化值傀顾,可省略變量類(lèi)型襟铭,由編譯器自動(dòng)推斷。

package main

var x int
var f float32 = 1.6
var s = "abc"
func main() {
}

一次性定義多個(gè)變量。

package main

var x, y, z int
var s, n = "abc", 123
var (
    a int
    b float32
)

func main() {
    n, s := 0x1234, "Hello, World!"
    println(x, s, n)
}

輸出結(jié)果:

0 Hello, World! 4660

多變量賦值時(shí)寒砖,先計(jì)算所有相關(guān)值赐劣,然后再?gòu)淖蟮接乙来钨x值。

package main

import "fmt"

func main() {
    data, i := [3]int{0, 1, 2}, 0
    i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
    fmt.Println(i, data)
}

輸出結(jié)果:

2 [100 1 2]

變量定義可以包含初始值入撒,每個(gè)變量對(duì)應(yīng)一個(gè)隆豹。

package main

var i, j int = 1, 2

func main() {
}

如果初始化是使用表達(dá)式,則可以省略類(lèi)型茅逮;變量從初始值中獲得類(lèi)型璃赡。

package main

var c, python, java = true, false, "no!"

func main() {

}

短聲明變量

在函數(shù)內(nèi)部,可以使用更簡(jiǎn)略的 ":=" 方式定義變量献雅。":=" 簡(jiǎn)潔賦值語(yǔ)句在明確類(lèi)型的地方碉考,可以用于替代 var 定義。

package main

import (
    "fmt"
)

var c, python, java = true, false, "no!"

func main() {
    k := 3
    c, python, java := false, true, "yes!"
    fmt.Println(c, python, java, k)
    //注意檢查挺身,是定義新的局部變量侯谁,還是修改全局變量。該方式容易造成錯(cuò)誤章钾!
}

輸出結(jié)果:

false true yes! 3

函數(shù)外的每個(gè)語(yǔ)句都必須以關(guān)鍵字開(kāi)始( var 墙贱、 func 、等等)贱傀, ":=" 結(jié)構(gòu)不能使用在函數(shù)外惨撇。

特殊只寫(xiě)變量 "_",用于忽略值占位府寒。

package main

func test() (int, string) {
    return 1, "abc"
}
func main() {
    _, s := test()
    println(s)
}

輸出結(jié)果:

abc

編譯器會(huì)將未使 的局部變量當(dāng)做錯(cuò)誤魁衙。

package main

var s string // 全局變量沒(méi)問(wèn)題。

func main() {
    i := 0 // ./main.go:6:7: i declared and not used
 (可使  "_ = i" 規(guī)避)
}

注意重新賦值與定義新同名變量的區(qū)別株搔。

package main

func main() {
    s := "abc"
    println(&s)
    s, y := "hello", 20 // 重新賦值: 與前 s 在同 層次的代碼塊中剖淀,且有新的變量被定義。
    println(&s, y)      // 通常函數(shù)多返回值 err 會(huì)被重復(fù)使用纤房。

    {
        s, z := 1000, 30 // 定義新同名變量: 不在同 層次代碼塊纵隔。
        println(&s, z)
    }
}

輸出結(jié)果:

0xc42003df60
0xc42003df60 20
0xc42003df58 30

Go 語(yǔ)言變量作用域

作用域?yàn)橐崖暶鳂?biāo)識(shí)符所表示的常量、類(lèi)型炮姨、變量捌刮、函數(shù)或包在源代碼中的作用范圍。

Go 語(yǔ)言中變量可以在三個(gè)地方聲明:

函數(shù)內(nèi)定義的變量稱(chēng)為局部變量
函數(shù)外定義的變量稱(chēng)為全局變量
函數(shù)定義中的變量稱(chēng)為形式參數(shù)

接下來(lái)讓我們具體了解局部變量剑令、全局變量和形式參數(shù)糊啡。

局部變量

在函數(shù)體內(nèi)聲明的變量稱(chēng)之為局部變量拄查,它們的作用域只在函數(shù)體內(nèi)吁津,參數(shù)和返回值變量也是局部變量。

以下實(shí)例中 main() 函數(shù)使用了局部變量 a, b, c:

package main

import "fmt"

func main() {
    /* 聲明局部變量 */
    var a, b, c int

    /* 初始化參數(shù) */
    a = 10
    b = 20
    c = a + b

    fmt.Printf("結(jié)果: a = %d, b = %d and c = %d\n", a, b, c)
}

輸出結(jié)果:

結(jié)果: a = 10, b = 20 and c = 30

全局變量

在函數(shù)體外聲明的變量稱(chēng)之為全局變量,全局變量可以在整個(gè)包甚至外部包(被導(dǎo)出后)使用碍脏。

全局變量可以在任何函數(shù)中使用梭依,以下實(shí)例演示了如何使用全局變量:

package main

import "fmt"

/* 聲明全局變量 */
var g int

func main() {

    /* 聲明局部變量 */
    var a, b int

    /* 初始化參數(shù) */
    a = 10
    b = 20
    g = a + b

    fmt.Printf("結(jié)果: a = %d, b = %d and g = %d\n", a, b, g)
}

輸出結(jié)果:

結(jié)果: a = 10, b = 20 and g = 30

Go 語(yǔ)言程序中全局變量與局部變量名稱(chēng)可以相同,但是函數(shù)內(nèi)的局部變量會(huì)被優(yōu)先考慮典尾。實(shí)例如下:

package main

import "fmt"

/* 聲明全局變量 */
var g int = 20

func main() {
    /* 聲明局部變量 */
    var g int = 10

    fmt.Printf("結(jié)果: g = %d\n", g)
}

輸出結(jié)果:

結(jié)果: g = 10

形式參數(shù)

形式參數(shù)會(huì)作為函數(shù)的局部變量來(lái)使用役拴。實(shí)例如下:

package main

import "fmt"

/* 聲明全局變量 */
var a int = 20

func main() {
    /* main 函數(shù)中聲明局部變量 */
    var a int = 10
    var b int = 20
    var c int = 0

    fmt.Printf("main()函數(shù)中 a = %d\n", a)
    c = sum(a, b)
    fmt.Printf("main()函數(shù)中 c = %d\n", c)
}

/* 函數(shù)定義-兩數(shù)相加 */
func sum(a, b int) int {
    fmt.Printf("sum() 函數(shù)中 a = %d\n", a)
    fmt.Printf("sum() 函數(shù)中 b = %d\n", b)

    return a + b
}

輸出結(jié)果:

main()函數(shù)中 a = 10
sum() 函數(shù)中 a = 10
sum() 函數(shù)中 b = 20
main()函數(shù)中 c = 30

不同類(lèi)型的局部和全局變量默認(rèn)值:
全局:

package main

import "fmt"

var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string

func main() {
    fmt.Printf("全局變量: bool 默認(rèn)值:%v\n", b)

    fmt.Printf("全局變量: int 默認(rèn)值:%v\n", i)
    fmt.Printf("全局變量: int8 默認(rèn)值:%v\n", i8)
    fmt.Printf("全局變量: int16 默認(rèn)值:%v\n", i16)
    fmt.Printf("全局變量: int32 默認(rèn)值:%v\n", i32)
    fmt.Printf("全局變量: int64 默認(rèn)值:%v\n", i64)
    fmt.Printf("全局變量: int64 默認(rèn)值:%v\n", i64)

    fmt.Printf("全局變量: uint 默認(rèn)值:%v\n", ui)
    fmt.Printf("全局變量: uint8 默認(rèn)值:%v\n", ui8)
    fmt.Printf("全局變量: uint16 默認(rèn)值:%v\n", ui16)
    fmt.Printf("全局變量: uint32 默認(rèn)值:%v\n", ui32)
    fmt.Printf("全局變量: uint64 默認(rèn)值:%v\n", ui64)
    fmt.Printf("全局變量: uint64 默認(rèn)值:%v\n", ui64)

    fmt.Printf("全局變量: float32 默認(rèn)值:%v\n", f32)
    fmt.Printf("全局變量: float64 默認(rèn)值:%v\n", f64)

    fmt.Printf("全局變量: string 默認(rèn)值:%v\n", s)
}

輸出結(jié)果:

全局變量: bool 默認(rèn)值:false
全局變量: int 默認(rèn)值:0
全局變量: int8 默認(rèn)值:0
全局變量: int16 默認(rèn)值:0
全局變量: int32 默認(rèn)值:0
全局變量: int64 默認(rèn)值:0
全局變量: int64 默認(rèn)值:0
全局變量: uint 默認(rèn)值:0
全局變量: uint8 默認(rèn)值:0
全局變量: uint16 默認(rèn)值:0
全局變量: uint32 默認(rèn)值:0
全局變量: uint64 默認(rèn)值:0
全局變量: uint64 默認(rèn)值:0
全局變量: float32 默認(rèn)值:0
全局變量: float64 默認(rèn)值:0
全局變量: string 默認(rèn)值:

局部:

package main

import "fmt"

func main() {

    var b bool
    var i int
    var i8 int8
    var i16 int16
    var i32 int32
    var i64 int64
    var ui uint
    var ui8 uint8
    var ui16 uint16
    var ui32 uint32
    var ui64 uint64
    var f32 float32
    var f64 float64
    var s string

    fmt.Printf("局部變量: bool 默認(rèn)值:%v\n", b)

    fmt.Printf("局部變量: int 默認(rèn)值:%v\n", i)
    fmt.Printf("局部變量: int8 默認(rèn)值:%v\n", i8)
    fmt.Printf("局部變量: int16 默認(rèn)值:%v\n", i16)
    fmt.Printf("局部變量: int32 默認(rèn)值:%v\n", i32)
    fmt.Printf("局部變量: int64 默認(rèn)值:%v\n", i64)
    fmt.Printf("局部變量: int64 默認(rèn)值:%v\n", i64)

    fmt.Printf("局部變量: uint 默認(rèn)值:%v\n", ui)
    fmt.Printf("局部變量: uint8 默認(rèn)值:%v\n", ui8)
    fmt.Printf("局部變量: uint16 默認(rèn)值:%v\n", ui16)
    fmt.Printf("局部變量: uint32 默認(rèn)值:%v\n", ui32)
    fmt.Printf("局部變量: uint64 默認(rèn)值:%v\n", ui64)
    fmt.Printf("局部變量: uint64 默認(rèn)值:%v\n", ui64)

    fmt.Printf("局部變量: float32 默認(rèn)值:%v\n", f32)
    fmt.Printf("局部變量: float64 默認(rèn)值:%v\n", f64)

    fmt.Printf("局部變量: string 默認(rèn)值:%v\n", s)
}

輸出結(jié)果:

局部變量: bool 默認(rèn)值:false
局部變量: int 默認(rèn)值:0
局部變量: int8 默認(rèn)值:0
局部變量: int16 默認(rèn)值:0
局部變量: int32 默認(rèn)值:0
局部變量: int64 默認(rèn)值:0
局部變量: int64 默認(rèn)值:0
局部變量: uint 默認(rèn)值:0
局部變量: uint8 默認(rèn)值:0
局部變量: uint16 默認(rèn)值:0
局部變量: uint32 默認(rèn)值:0
局部變量: uint64 默認(rèn)值:0
局部變量: uint64 默認(rèn)值:0
局部變量: float32 默認(rèn)值:0
局部變量: float64 默認(rèn)值:0
局部變量: string 默認(rèn)值:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钾埂,隨后出現(xiàn)的幾起案子河闰,更是在濱河造成了極大的恐慌,老刑警劉巖褥紫,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姜性,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡髓考,警方通過(guò)查閱死者的電腦和手機(jī)部念,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氨菇,“玉大人儡炼,你說(shuō)我怎么就攤上這事〔槿兀” “怎么了乌询?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)奶是。 經(jīng)常有香客問(wèn)我楣责,道長(zhǎng),這世上最難降的妖魔是什么聂沙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任秆麸,我火速辦了婚禮,結(jié)果婚禮上及汉,老公的妹妹穿的比我還像新娘沮趣。我一直安慰自己,他們只是感情好坷随,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布房铭。 她就那樣靜靜地躺著,像睡著了一般温眉。 火紅的嫁衣襯著肌膚如雪缸匪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天类溢,我揣著相機(jī)與錄音凌蔬,去河邊找鬼露懒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砂心,可吹牛的內(nèi)容都是我干的懈词。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辩诞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坎弯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起译暂,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抠忘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后外永,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褐桌,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年象迎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荧嵌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砾淌,死狀恐怖啦撮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汪厨,我是刑警寧澤赃春,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站劫乱,受9級(jí)特大地震影響织中,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衷戈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一狭吼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殖妇,春花似錦刁笙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至前鹅,卻和暖如春摘悴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舰绘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工蹂喻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留延赌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓叉橱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親者蠕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窃祝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容