Go語言之變數篇(一)
本人原本是C++開發工程師,使用C++已經有8年多的時間,最近在學習Go語言,在學習Go語言的時候,難免會拿Go語言與C++語言做一些比較。
這篇文章便是筆者,在學習Go語言變數的時候,整理的一些知識。
一、變數定義的格式
C++的變數定義表示式如下所示:
Type name = expression; ,例如 int number = 10; // 表示的是 一個數據型別是int,名字叫做 number 的變數,它的初始值是 10。
Go的變數定義表示式如下所示:
var name type = expression ,例如 var number int = 10 // 表示的是 一個數據型別是int,名字叫做 number 的變數,它的初始值是 10。
區別:
1.C++ 需要在一句話的結尾 加上一個;號,用來表示語句結束,Go語言則不需要;號,它是通過換行來表示該語句結束的。
2.C++ 和Go的語句定義格式完全不同,C++是 Type name = expression; Go是var name type = expression
3.C++和Go語言沒有賦初始值的變數的初始化數值不相同。
1)C++的初始值不指定的話,例如int number; number的值有可能是0,也有可能是隨機值,這個取決於number 是一個區域性變數還是一個全域性變數或者static變數,區域性變數的話,number的值是個隨機值,全域性和static變數的話,number的值會是0。
2) Go的初始值不指定的話,例如var number int; 這裡會被初始化為0。Go語言裡面不存在未初始化的變數。Go規定,如果表示式省略,初始化數值,數字對應0,布林型對應false,字串對應"",對於介面和引用型別為nil。
4.C++和Go語言的變數宣告,Go更加的強大
C++ 中 變數沒有初始化的話,可以採用變數列表的方式,否則只能一條語句一個變數,例如:
int a,b,c; // 其中a,b,c 都必須是整型,型別必須一致。
int a = 10; // 必須一個變數一條語句
Go 中書寫方式更為靈活多變,例如:
var a, b, c int // 表示a,b,c 都是int型資料,同時初始化為0
var a , b, c = true, 10, "hello" // 省略了資料型別,並且 a,b,c可以分別是幾種不同的資料型別,其中a是bool型,b是int型, c是string型。
5.Go語言中有變數和短變數宣告兩種方式,C++ 中則只有變數
短變數宣告格式為: name := expression // name的型別通過expression來決定。因為它短小,靈活,主要用於區域性變數的宣告和初始化。
var宣告的變數通常為那些跟初始化表示式型別不一致的區域性變數,或者後面才對變數賦值的情況。
個人認為短變數宣告存在的主要原因是,Go語言的 多種型別變數可以在同一行賦值的支援,例如 a, b := 1,true // 在這裡a,b可以都是新的變數並且不是初始化的時候,或者a,b中有一個是新變數即可。 var變數對於後者的支援就不太好,必須是兩行才能保證,如下所示:
var a , b = 0 , false // step1: a, b必須都得先定義出來
a,b = 1, true // step 2: a,b 在進行賦值
而短變數只需要一句就可以表示。
二、變數的作用域和生存週期
在談C++和Go的區別之前,我們先看一看,作用域和生命週期是什麼東西。
作用域: 存在於編譯階段,用來表示變數或者方法的適用範圍,一般都是大括號內的那一部分,叫做一個程式塊,這一塊內容,便是一個作用域。
生命週期: 是執行階段的概念,從一個變數例項被建立,到該變數被釋放的時間週期。
區別:
1.C++語言,在作用域 範圍這個概念下,{}之內宣告的變數,在該程式碼段可以被使用,在該{}之外生成的同名變數,會被覆蓋掉。
Go語言,在作用域 概念下,與C++語言並無區別。不過短變數宣告使用有一個點要注意。例如:
var num int
var b string
{
a, num := false, 5 // 這裡的num會被認為是一個新變數
b = “hello” // 這裡的b與{}外的b是同一個變數
}
2.C++在生存週期 這個範圍內,區域性變數非指標的話,有一個static是特例,這個的生存週期是整個程序從建立到銷燬,這一段時間。其他的區域性變數,都是程式執行的時候從{執行到}這一執行週期。
Go語言的變數例項的生命週期 與C++的類似,不過Go有一個變數“外溢”的概念,這種變數的生命週期取決於“外溢”的生命週期。
灰子作於二零一九年三月三日。
【原創作品,歡迎分享,請勿轉載,謝謝尊重!!】