Golang學習筆記 variable

2022-08-30 11:57:12 字數 3780 閱讀 6744

#變數和常量定義

現在我們討論一下go語言的變數定義。

**變數定義**

所謂的變數就是乙個擁有指定`名稱`和`型別`的`資料儲存位置`。

在上面我們使用過變數的定義,現在我們來仔細看乙個例子。

1

package main23

import(4

"fmt"5

)67func main()

1

package main23

import(4

"fmt"5

)67func main()

或者是直接賦值,讓go語言推斷變數的型別。如下:

1

package main23

import(4

"fmt"5

)67func main()

當然,上面變數的定義還有一種`快捷方式`。如果你知道變數的初始值,完全可以像下面這樣定義變數,完全讓`go來推斷語言的型別`。這種定義的方式連關鍵字`var`都省略掉了。

1

package main23

import(4

"fmt"5

)67func main()

注意:上面這種使用`:=`方式定義變數的方式`只能用在函式內部`。

1

package main23

import(4

"fmt"5

)67 x:="

hello world"8

func main()

對於上面的變數定義x是無效的。會導致編譯錯誤:

./test_var_quick.go:7: non-declaration statement outside function body

不過我們對上面的例子做下修改,比如這樣是可以的。也就是使用var關鍵字定義的時候,如果給出初始值,就不需要顯式指定變數型別。

1

package main23

import(4

"fmt"5

)67 var x = "

hello world"8

9func main()

`變數`之所以稱為變數,就是因為`它們的值在程式執行過程中可以發生變化`,但是`它們的變數型別是無法改變的`。因為`go語言是靜態語言`,並`不支援`程式執行過程中`變數型別發生變化`。比如如果你強行將乙個字串值賦值給定義為int的變數,那麼會發生編譯錯誤。即使是強制型別轉換也是不可以的。`強制型別轉換只支援同類的變數型別`。比如數值型別之間強制轉換。

下面我們看幾個例子:

1

package main23

import(4

"fmt"5

)67func main()

本例子演示變數的值在程式執行過程中發生變化,結果輸出為

hello world

i love go language

我們嘗試不同型別的變數之間轉換

1

package main23

import(4

"fmt"5

)67func main()

在本例子中,如果試圖將乙個數值賦予字串變數x,那麼會發生錯誤:

./test_var.go:10: cannot use 11 (type int) as type string in assignment

上面的意思就是無法將整型數值11當作字串賦予給字串變數。

但是同類的變數之間是可以強制轉換的,如浮點型和整型之間的轉換。

1

package main23

import(4

"fmt"5

)67func main()

輸出的結果為

32.35

32**變數命名**

上面我們看了一些變數的使用方法,那麼定義乙個變數名稱,有哪些要求呢?

這裡我們要注意,`go的變數名稱必須以字母或下劃線(_)開頭,後面可以跟字母,數字,或者下劃線(_)`。除此之外,go語言並不關心你如何定義變數。我們通用的做法是定義乙個使用者友好的變數。假設你需要定義乙個狗狗的年齡,那麼使用dog_age作為變數名稱要好於用x來定義變數。

**變數作用域**

現在我們再來討論一下變數的作用域。所謂作用域就是可以有效訪問變數的區域。比如很簡單的,你不可能在乙個函式func_a裡面訪問另乙個函式func_b裡面定義的區域性變數x。所以變數的作用域目前分為兩類,乙個是`全域性變數`,另乙個是`區域性變數`。下面我們看個全域性變數的例子:

1

package main23

import(4

"fmt"5

)67 var x string = "

hello world"8

9func main()

這裡變數x定義在main函式之外,但是main函式仍然可以訪問x。全域性變數的作用域是該包中所有的函式。

1

package main23

import(4

"fmt"5

)67 var x string = "

hello world"8

9func change()

12func main()

在上面的例子用,我們用了change函式改變了x的值。輸出結果如下:

hello world

i love go

我們再看一下區域性變數的例子。

1

package main23

import(4

"fmt"5

)67func change()

10func main()

該例子中main函式試圖訪問change函式中定義的區域性變數x,結果發生了下面的錯誤(未定義的變數x):

./test_var.go:11: undefined: x

**常量**

go語言也支援常量定義。所謂`常量就是在程式執行過程中保持值不變的變數定義`。常量的定義和變數類似,只是用`const`關鍵字替換了var關鍵字,另外常量在定義的時候`必須有初始值`。

1

package main23

import(4

"fmt"5

)67func main()

這裡有一點需要注意,變數定義的型別推斷方式`:=`不能夠用來定義常量。因為常量的值是在編譯的時候就已經確定的,但是變數的值則是執行的時候才使用的。這樣常量定義就無法使用變數型別推斷的方式了。

常量的值在執行過程中是無法改變的,強制改變常量的值是無效的。

1

package main23

import(4

"fmt"5

)67func main()

比如上面的例子就會報錯

./test_var.go:10: cannot assign to x

我們再看乙個go包math裡面定義的常量pi,用它來求圓的面積。

1

package main23

import(4

"fmt"5

"math"6

)78func main()

**多變數或常量定義**

go還提供了一種`同時定義多個變數或者常量`的快捷方式。

1

package main23

import(4

"fmt"5

)67func main()

Golang學習筆記

如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...

Golang學習筆記

package main import fmt func main break default func inte ce select case defer gomap struct chan else goto package switch const fallthrough ifrange ty...