Go 語言變量名由字母、數字、下劃線組成,其中首個字母不能爲數字。python
聲明變量的通常形式是使用 var 關鍵字:ide
var identifier type
第一種,指定變量類型,聲明後若不賦值,使用默認值。函數
var v_name v_type v_name = value
第二種,根據值自行斷定變量類型。佈局
var v_name = value
第三種,省略var, 注意 :=左側的變量不該該是已經聲明過的,不然會致使編譯錯誤。spa
v_name := value var a int = 10 var b = 10 c : = 10
//類型相同多個變量, 非全局變量 var vname1, vname2, vname3 type vname1, vname2, vname3 = v1, v2, v3 var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不須要顯示聲明類型,自動推斷 vname1, vname2, vname3 := v1, v2, v3 //出如今:=左側的變量不該該是已經被聲明過的,不然會致使編譯錯誤 // 這種因式分解關鍵字的寫法通常用於聲明全局變量 var ( vname1 v_type1 vname2 v_type2 )
全部像 int、float、bool 和 string 這些基本類型都屬於值類型,使用這些類型的變量直接指向存在內存中的值。當使用等號 =
將一個變量的值賦值給另外一個變量時,如:j = i
,其實是在內存中將 i 的值進行了拷貝,你能夠經過 &i 來獲取變量 i 的內存地址,例如:0xf840000040(每次的地址均可能不同)。值類型的變量的值存儲在棧中。指針
一個引用類型的變量 r1 存儲的是 r1 的值所在的內存地址,或內存地址中第一個字所在的位置。這個內存地址爲稱之爲指針,這個指針實際上也被存在另外的某一個字中。同一個引用類型的指針指向的多個字能夠是在連續的內存地址中(內存佈局是連續的),這也是計算效率最高的一種存儲形式;也能夠將這些字分散存放在內存中,每一個字都指示了下一個字所在的內存地址。code
當使用賦值語句 r2 = r1 時,只有引用(地址)被複制。若是 r1 的值被改變了,那麼這個值的全部引用都會指向被修改後的內容,在這個例子中,r2 也會受到影響。blog
若是你聲明瞭一個局部變量卻沒有在相同的代碼塊中使用它,一樣會獲得編譯錯誤,例以下面這個例子當中的變量 a:內存
package main import "fmt" func main() { var a string = "abc" fmt.Println("hello, world") }
嘗試編譯這段代碼將獲得錯誤 a declared and not used。這個值必須被使用,因此使用 fmt.Println("hello, world", a) 會移除錯誤。字符串
可是全局變量是容許聲明但不使用。 同一類型的多個變量能夠聲明在同一行,如:
var a, b, c int
多變量能夠在同一行進行賦值,稱之爲並行賦值,如:
a, b, c = 5, 7, "abc"
若是你想要交換兩個變量的值,則能夠簡單地使用 a, b = b, a。
空白標識符 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。
_ 其實是一個只寫變量,你不能獲得它的值。這樣作是由於 Go 語言中你必須使用全部被聲明的變量,但有時你並不須要使用從一個函數獲得的全部返回值。
並行賦值也被用於當一個函數返回多個返回值時,好比這裏的 val 和錯誤 err 是經過調用 Func1 函數同時獲得:val, err = Func1(var1)。
常量是一個簡單值的標識符,在程序運行時,不會被修改的量。常量中的數據類型只能夠是布爾型、數字型(整數型、浮點型和複數)和字符串型。
常量的定義格式:
const identifier [type] = value
你能夠省略類型說明符 [type],由於編譯器能夠根據變量的值來推斷其類型。
const b string = "abc"
const b = "abc"
多個相同類型的聲明能夠簡寫爲:
const c_name1, c_name2 = value1, value2
常量還能夠用做枚舉:
const ( Unknown = 0 Female = 1 Male = 2 )
常量能夠用len(), cap(), unsafe.Sizeof()函數計算表達式的值。常量表達式中,函數必須是內置函數,不然編譯不過:
package main import "unsafe" const ( a = "abc" b = len(a) c = unsafe.Sizeof(a) ) func main(){ println(a, b, c) }
以上實例運行結果爲:
abc 3 16
運算符用於在程序運行時執行數學或邏輯運算。Go 語言內置的運算符有:
算術運算符有加+,減-,乘*,除/,自增++,自減--
關係運算符有相等==,不等!=,大於>,小於<,大於等於>=,小於等於<=
邏輯運算符有與&&,或||,非!
位運算符對整數在內存中的二進制位進行操做。位運算符有位與 &,位或 |,和異或 ^ ,左移運算<<,右移運算符>>。
左移運算符"<<"是雙目運算符。左移n位就是乘以2的n次方。 其功能把"<<"左邊的運算數的各二進位所有左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0。
右移運算符">>"是雙目運算符。右移n位就是除以2的n次方。 其功能是把">>"左邊的運算數的各二進位所有右移若干位,">>"右邊的數指定移動的位數。高位補上符號位。
go支持加強賦值運算,如 +=,-=等
取地址運算符&
指針運算符*
有些運算符擁有較高的優先級,二元運算符的運算方向均是從左至右。下表列出了全部運算符以及它們的優先級,由上至下表明優先級由高到低:
優先級 | 運算符 |
---|---|
7 | ^ ! |
6 | * / % << >> & &^ |
5 | + - | ^ |
4 | == != < <= >= > |
3 | <- |
2 | && |
1 | || |
建議經過使用括號來明確某個表達式的總體運算優先級。