本文始發於個人公眾號:TechFlow,原創不易,求個關注
今天是Golang的第三篇,我們一起來看看Golang當中的變量。
變量聲明
Golang當中的變量類型和C/C++比較接近,一般用的比較多的也就是int,float和字符串。Golang當中不一樣的地方主要有幾點,第一點是嚴格區分了int,int16,int32和int64,同樣區分了float,float32和float64。
前文當中說過,Golang是不支持隱式轉換的,哪怕是int和int32也一樣。
var v1 int
var v2 int32 = 10
v1 = v2
上面的代碼是會報錯的,因為我們用一個int類型的變量去接收了int32類型的。雖然Golang當中int一般也是32位的整數,但是這依然會被認為是兩個不同的類型。
第二點是Golang當中自帶了map類型,像是java以及C++雖然也有map,但是都不是原生支持的,而是必須要通過引入包才可以使用的。所以Golang的設計者就覺得這很二,沒必要啊,既然所有程序員都要用到map,為什么還非要引入包才能使用呢,直接嵌入在默認類型里好了。於是Golang的基本類型當中就有map。
另外一點是Golang當中是有指針的,但是和C語言當中的指針不太一樣,我們先記住這一點,具體的內容我們在后面介紹。
最后一點是Golang當中多了復數類型,也就是complex64和complex128,用來支持復數的運算。一般情況下我們也不太用得到,所以暫時略過。
Golang的聲明方法很簡單,使用var關鍵字進行。和平常的語言不太一樣的是Golang當中的變量類型寫在變量名的后面,而不是前面。
比如:
var v1 int
var v2 float32
剛開始的時候會覺得有些不太適應,但是這樣設計是有它的道理的。尤其在涉及指針的時候,把變量類型寫在后面的方法可以增加可讀性。比如我們來看一個例子,在C語言當中支持指向函數的指針。
double (*funcPtr)(double a, double b);
這是一個指向函數的指針,如果我們增加一下難度,比如我們把這個函數指針作為參數傳入其中也變成一個函數指針,整個定義寫出來就會非常復雜:
double (*funcPtr)(double a, void(*funcPtr2)(int b, double c));
這個可讀性非常差,估計要看很久才能看懂,如果是忘了函數指針這茬,估計就徹底看不懂了。
我們再來看Golang的定義:
var v1 func(a float32, funcA func(b int, c double)) double
相比之下,golang的定義要比C看起來可讀性強很多。如果你看不太明白上面的例子也沒關系,我們只需要記住這個結論即可。
初始化
Golang當中有三種初始化的方法,我們直接來看代碼:
var v2 int = 10
var v3 = 10
v4 := 10
第一種方式最復雜,我們不但寫出了變量類型還寫出了初始化之后的值。第二種精簡許多,我們只寫了值,編譯器會自動根據我們寫的值去匹配對應的類型。最后一種我們連var和類型都不寫了,但是需要加上冒號,和賦值操作做區分。
剛開始可能會有一些不太適應,尤其是Python選手,一向無所謂類型的。但是寫習慣了之后還可以,並沒有體驗很差,而且寫這種語法很嚴謹的語言有助於提升我們的代碼風格和嚴謹。
唯一一點要注意的就是同一個變量不能被連續申明兩次,下面兩種寫法都是錯誤的。
var s string = "hello"
var s string = "hello"
s := "hello"
s := "world"
變量賦值
變量賦值其實沒什么好說的,就是等於號賦值,直接左邊等於右邊即可。
如果只使用賦值的話,所有的變量必須已經經過初始化才可以。畢竟不是動態語言,不像Python不能隨便定義。不過有一點需要注意,Golang當中非常務實地提供了多變量的賦值操作。比如我們要交換兩個變量的值,我們可以用一行語句完成,不再需要引入額外變量了。
a, b = b, a
另外,Golang當中也支持匿名變量,也就是說對於我們不需要的返回值,我們可以不用額外定義一個變量去接收。否則沒有用處,還會報錯。
比如,假設我們一個函數返回兩個變量,但是我們只需要用到其中的一個,我們可以這樣寫:
ret, _ = sample()
如果這里的變量之前沒有定義過,我們還可以這么寫:
ret, _ := sample()
直接用函數返回值來聲明並賦值變量。
關於變量這一塊Golang和C++等語言變化不大,如果有C++基礎的話,學習起來應該非常快速。並且相比於C++繁多的語法和眾多的應用方法,Golang的學習曲線要平緩很多,入門也更簡單。我相信對你們來說一定都不是問題。
勘誤
最后做一個小小的勘誤,由於我學習資料過於陳舊,導致上周關於golang中常量定義的闡述發生了錯誤,在此進行勘誤。在最新的golang版本當中,規定const變量也通過駝峰命名法命名,並且首字母必須大寫。
這里感謝Taosama大神的勘誤。
const HelloWorld = "hello world"
今天的文章就是這些,如果覺得有所收獲,請順手點個在看或者轉發吧,你們的舉手之勞對我來說很重要。