當前位置:
首頁 > 知識 > Go 語言變數

Go 語言變數

變數來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。

Go 語言變數名由字母、數字、下劃線組成,其中首個字母不能為數字。

聲明變數的一般形式是使用 var 關鍵字:

var identifier type

Go 語言變數

變數聲明

第一種,指定變數類型,聲明後若不賦值,使用默認值。

var v_name v_typev_name = value

第二種,根據值自行判定變數類型。

var v_name = value

第三種,省略var, 注意 :=左側的變數不應該是已經聲明過的,否則會導致編譯錯誤。

v_name := value// 例如var a int = 10var b = 10c : = 10

實例如下:

package mainvar a = "w3cschool菜鳥教程"var b string = "w3cschool.cc"var c boolfunc main(){println(a, b, c)}

以上實例執行結果為:

w3cschool菜鳥教程 w3cschool.cc false

Go 語言變數

多變數聲明

//類型相同多個變數, 非全局變數var vname1, vname2, vname3 typevname1, vname2, vname3 = v1, v2, v3var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要顯示聲明類型,自動推斷vname1, vname2, vname3 := v1, v2, v3 //出現在:=左側的變數不應該是已經被聲明過的,否則會導致編譯錯誤// 這種因式分解關鍵字的寫法一般用於聲明全局變數var (vname1 v_type1vname2 v_type2)

實例如下:

package mainvar x, y intvar ( // 這種因式分解關鍵字的寫法一般用於聲明全局變數a intb bool)var c, d int = 1, 2var e, f = 123, "hello"//這種不帶聲明格式的只能在函數體中出現//g, h := 123, "hello"func main(){g, h := 123, "hello"println(x, y, a, b, c, d, e, f, g, h)}

以上實例執行結果為:

0 0 0 false 1 2 123 hello 123 hello


值類型和引用類型

所有像 int、float、bool 和 string 這些基本類型都屬於值類型,使用這些類型的變數直接指向存在內存中的值:

Go 語言變數

當使用等號

=

將一個變數的值賦值給另一個變數時,如:

j = i

,實際上是在內存中將 i 的值進行了拷貝:

Go 語言變數

你可以通過 &i 來獲取變數 i 的內存地址,例如:0xf840000040(每次的地址都可能不一樣)。值類型的變數的值存儲在棧中。

內存地址會根據機器的不同而有所不同,甚至相同的程序在不同的機器上執行後也會有不同的內存地址。因為每台機器可能有不同的存儲器布局,並且位置分配也可能不同。

更複雜的數據通常會需要使用多個字,這些數據一般使用引用類型保存。

一個引用類型的變數 r1 存儲的是 r1 的值所在的內存地址(數字),或內存地址中第一個字所在的位置。

Go 語言變數

這個內存地址為稱之為指針,這個指針實際上也被存在另外的某一個字中。

同一個引用類型的指針指向的多個字可以是在連續的內存地址中(內存布局是連續的),這也是計算效率最高的一種存儲形式;也可以將這些字分散存放在內存中,每個字都指示了下一個字所在的內存地址。

當使用賦值語句 r2 = r1 時,只有引用(地址)被複制。

如果 r1 的值被改變了,那麼這個值的所有引用都會指向被修改後的內容,在這個例子中,r2 也會受到影響。



Go 語言變數

簡短形式,使用 := 賦值操作符

我們知道可以在變數的初始化時省略變數的類型而由系統自動推斷,聲明語句寫上 var 關鍵字其實是顯得有些多餘了,因此我們可以將它們簡寫為 a := 50 或 b := false。

a 和 b 的類型(int 和 bool)將由編譯器自動推斷。

這是使用變數的首選形式,但是它只能被用在函數體內,而不可以用於全局變數的聲明與賦值。使用操作符 := 可以高效地創建一個新的變數,稱之為初始化聲明。

注意事項

如果在相同的代碼塊中,我們不可以再次對於相同名稱的變數使用初始化聲明,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=,但是 a = 20 是可以的,因為這是給相同的變數賦予一個新的值。

如果你在定義變數 a 之前使用它,則會得到編譯錯誤 undefined: a。

如果你聲明了一個局部變數卻沒有在相同的代碼塊中使用它,同樣會得到編譯錯誤,例如下面這個例子當中的變數 a:

func main() {var a string = "abc"fmt.Println("hello, world")}

嘗試編譯這段代碼將得到錯誤 a declared and not used

此外,單純地給 a 賦值也是不夠的,這個值必須被使用,所以使用

fmt.Println("hello, world", a)

會移除錯誤。

但是全局變數是允許聲明但不使用。 同一類型的多個變數可以聲明在同一行,如:

var a, b, c int

多變數可以在同一行進行賦值,如:

a, b, c = 5, 7, "abc"

上面這行假設了變數 a,b 和 c 都已經被聲明,否則的話應該這樣使用:

a, b, c := 5, 7, "abc"

右邊的這些值以相同的順序賦值給左邊的變數,所以 a 的值是 5, b 的值是 7,c 的值是 "abc"。

這被稱為 並行 或 同時 賦值。

如果你想要交換兩個變數的值,則可以簡單地使用 a, b = b, a。

空白標識符 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。

_ 實際上是一個只寫變數,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被聲明的變數,但有時你並不需要使用從一個函數得到的所有返回值。

並行賦值也被用於當一個函數返回多個返回值時,比如這裡的 val 和錯誤 err 是通過調用 Func1 函數同時得到:val, err = Func1(var1)。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Go 語言環境安裝
Go 語言數據類型
C 泛型(Generic)
C 不安全代碼

TAG:程序員小新人學習 |

您可能感興趣

Go 語言變數作用域
UG根據幀數變數做動畫
C語言數據類型、常量和變數
Perl 變數
C 的變數
Shell 變數
ASP 的變數
Python數據類型、運算符、變數
Python基礎-變數、字元串、數字
Python 函數式編程:不可變數據結構
Perl 特殊變數
VBScript 變數
VBA之數據類型和常量與變數
Python變數很難記?記住變數類型的三種方式
「Python」Chapter1 變數和簡單數據類型
python基礎之變數與運算符
Bash 環境變數的那些事
微軟摺疊屏專利現身,Surface Phone或有變數
又是熟悉的控制變數法?iG提拔二隊中單頂替Rookie!
Python實現變數分箱及應用