Go的變量
全局變量(在函數體之外的變量)
- 聲明方式:
var 變量名 變量類型
- 賦值:
變量名 = 變量的值或表達式
- 聲明的同時賦值:
var 變量名 [變量類型] = 變量的值或表達式
- 變量的類型可以省略,由系統自動推斷
var a int = 1 var b = 2.1
- 多個全局變量的聲明可以使用
var()
合併(當然也能同時賦值)
除了使用var ( a int b bool str string )
var()
合併的方式,也可以使用並行的方式:var a, b, c int a, b, c = 1, 2, 3
局部變量(函數體內或者方法體內)
- 可以和上面的全局變量一樣,使用
var 變量名 [變量類型] = 變量值或表達式
這種方式來聲明和賦值 - 除了以上的方式,還可以使用
:=
的形式簡寫(可以省略掉var
關鍵字,這種方式只能是局部變量使用)a := 1 b := "hello"
- 多個局部變量的聲明不可用
var()
這種方式,只能使用並行方式,可以結合簡寫形式使用a, b, c := 1, 2, "abc"
需要注意幾點:
- 如果聲明瞭一個局部變量卻沒有在代碼塊中使用它,會得到編譯錯誤:
變量名 declared but not used
(堅決不冗餘~~~) - 如果在相同的代碼塊中,我們不可以再次對於相同名稱的變量使用初始化聲明(賦值可以)
- 所有變量都可以使用類型推斷(但是一些特定類型如
int32
這種就難以自動推斷了) - 儘管變量的標識符必須是唯一的,但你可以在某個代碼塊的內層代碼塊中使用相同名稱的變量,則此時外部的同名變量將會暫時隱藏(結束內部代碼塊的執行後隱藏的外部同名變量又會出現,而內部同名變量則被釋放),你任何的操作都只會影響內部代碼塊的局部變量
- 可以使用
_
來表示拋棄值_, a = 1, 2
類型轉換
- Go中不存在隱式轉換,所有類型轉換必須顯示聲明
- 轉換隻能發生在兩種相互兼容的類型之間 (比如數值型和布爾型之間就無法轉換)
- 類型轉換的格式:
變量A = 類型(變量B)
var a float32 = 1.1 b := int(a)
Go的常量
-
常量使用關鍵字
const
定義,用於存儲不會改變的數據 -
常量的定義格式與變量基本相同,
const 常量名 [常量類型] = 常量值
,其中常量類型可以省略,由系統自動推斷const PI = 3.141592658 const str string = "hello"
-
多個常量的定義方式同多個變量的定義方式類似,如果有多個常量需要定義賦值,可以使用
const()
常量組的方式合併。const( PI = 3.141592658 str = "hello" )
如果不提供初始值,將使用上行常量的值:
const( a = "A" b // b爲 “A” )
-
常量的值必須在編譯時就能確定,可以在賦值表達式中涉及計算過程,但是所有用於計算的值必須在編譯期間就能獲得
-
自定義的函數在編譯期間均屬於未知,因此無法用於常量的賦值,但一些內置函數比如
len()
就可以使用 -
反斜槓
\
在常量表達式中可以作爲多行的連接符使用const c = 0.4232324242328786350073402\ 378371802711809823413478937
-
使用常量來用作枚舉
const ( Spring = 1 Summer = 2 Autumn = 3 Winter = 4 )
除了上面這種寫法,還可用常量的計數器
iota
來操作,它從0開始,常量組中每定義一個新的常量,該值自動加1。每當遇到一個新的const
關鍵字,iota
的值會重置爲0。上面的枚舉可以用下面的形式來表示(Summer
、Autumn
、Winter
沒有賦值,它們的值取上一行的值,即iota
)const ( Spring = iota //Spring=iota=0 Summer //Summer=iota=1 Autumn //Autumn=iota=2 Winter //Winter=iota=3 ) const ( //這裏新定義了一個常量組,iota的值置爲0 Man = iota //Man=iota=0 Female //Female=iota=1 )