變量與常量
什么是變量
變量是為存儲特定類型的值而提供給內(nèi)存位置的名稱煞肾。在go中聲明變量有多種語法刀疙。
聲明變量
var名稱類型是聲明單個(gè)變量的語法舔痕。
以字母或下劃線開頭魏滚,由一個(gè)或多個(gè)字母镀首、數(shù)字、下劃線組成鼠次。
聲明一個(gè)變量
第一種更哄,指定變量類型,聲明后若不賦值腥寇,使用默認(rèn)值
var name type
name = value
第二種成翩,根據(jù)值自行判定變量類型(類型推斷Type inference)
如果一個(gè)變量有一個(gè)初始值,Go將自動能夠使用初始值來推斷該變量的類型赦役。因此麻敌,如果變量具有初始值,則可以省略變量聲明中的類型掂摔。
var name = value
第三種术羔,省略var, 注意 :=左側(cè)的變量不應(yīng)該是已經(jīng)聲明過的(多個(gè)變量同時(shí)聲明時(shí),至少保證一個(gè)是新變量)乙漓,否則會導(dǎo)致編譯錯誤(簡短聲明)
name := value
// 例如
var a int = 10
var b = 10
c : = 10
這種方式它只能被用在函數(shù)體內(nèi)级历,而不可以用于全局變量的聲明與賦值
示例
package main
var a = "Hello"
var b string = "World"
var c bool
func main(){
println(a, b, c)
}
結(jié)果
Hello World false
多變量聲明
第一種,以逗號分隔叭披,聲明與賦值分開寥殖,若不賦值,存在默認(rèn)值
var name1, name2, name3 type
name1, name2, name3 = v1, v2, v3
第二種,直接賦值扛禽,下面的變量類型可以是不同的類型
var name1, name2, name3 = v1, v2, v3
第三種锋边,集合類型
var (
name1 type1
name2 type2
)
注意事項(xiàng)
如果在相同的代碼塊中,我們不可以再次對于相同名稱的變量使用初始化聲明编曼,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=剩辟,但是 a = 20 是可以的掐场,因?yàn)檫@是給相同的變量賦予一個(gè)新的值。
如果你在定義變量 a 之前使用它贩猎,則會得到編譯錯誤 undefined: a熊户。
如果你聲明了一個(gè)局部變量卻沒有在相同的代碼塊中使用它,同樣會得到編譯錯誤吭服,例如下面這個(gè)例子當(dāng)中的變量 a:
func main() {
var a string = "abc"
fmt.Println("hello, world")
}
嘗試編譯這段代碼將得到錯誤 a declared and not used
此外嚷堡,單純地給 a 賦值也是不夠的,這個(gè)值必須被使用
在同一個(gè)作用域中艇棕,已存在同名的變量蝌戒,則之后的聲明初始化,則退化為賦值操作沼琉。但這個(gè)前提是北苟,最少要有一個(gè)新的變量被定義,且在同一作用域打瘪,例如友鼻,下面的y就是新定義的變量
package main
import (
"fmt"
)
func main() {
x := 140
fmt.Println(&x)
x, y := 200, "abc"
fmt.Println(&x, x)
fmt.Print(y)
}
結(jié)果
0xc04200a2b0
0xc04200a2b0 200
abc
空白標(biāo)識符 _ 也被用于拋棄值,如值 5 在:_, b = 5, 7 中被拋棄
_ 實(shí)際上是一個(gè)只寫變量闺骚,你不能得到它的值彩扔。這樣做是因?yàn)?Go 語言中你必須使用所有被聲明的變量,但有時(shí)你并不需要使用從一個(gè)函數(shù)得到的所有返回值
并行賦值也被用于當(dāng)一個(gè)函數(shù)返回多個(gè)返回值時(shí)僻爽,比如這里的 val 和錯誤 err 是通過調(diào)用 Func1 函數(shù)同時(shí)得到:val, err = Func1(var1)
常量聲明
常量是一個(gè)簡單值的標(biāo)識符虫碉,在程序運(yùn)行時(shí),不會被修改的量进泼。
常量中的數(shù)據(jù)類型只可以是布爾型蔗衡、數(shù)字型(整數(shù)型、浮點(diǎn)型和復(fù)數(shù))和字符串型
不曾使用的常量乳绕,在編譯的時(shí)候绞惦,是不會報(bào)錯的
顯示指定類型的時(shí)候,必須確保常量左右值類型一致洋措,需要時(shí)可做顯示類型轉(zhuǎn)換济蝉。這與變量就不一樣了,變量是可以是不同的類型值
const identifier [type] = value
顯式類型定義: const b string = "abc"
隱式類型定義: const b = "abc"
package main
import "fmt"
func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" //多重賦值
area = LENGTH * WIDTH
fmt.Printf("面積為 : %d", area)
println()
println(a, b, c)
}
結(jié)果
面積為 : 50
1 false str
常量可以作為枚舉
const (
Unknown = 0
Female = 1
Male = 2
)
常量組中如不指定類型和初始化值,則與上一行非空常量右值相同
package main
import (
"fmt"
)
func main() {
const (
x uint16 = 16
y
s = "abc"
z
)
fmt.Printf("%T,%v\n", y, y)
fmt.Printf("%T,%v\n", z, z)
}
結(jié)果
uint16,16
string,abc
iota
iota王滤,特殊常量贺嫂,可以認(rèn)為是一個(gè)可以被編譯器修改的常量
在每一個(gè)const關(guān)鍵字出現(xiàn)時(shí),被重置為0雁乡,然后再下一個(gè)const出現(xiàn)之前第喳,每出現(xiàn)一次iota,其所代表的數(shù)字會自動增加1
iota 可以被用作枚舉值:
const (
a = iota
b = iota
c = iota
)
第一個(gè) iota 等于 0踱稍,每當(dāng) iota 在新的一行被使用時(shí)曲饱,它的值都會自動加 1;所以 a=0, b=1, c=2 可以簡寫為如下形式:
const (
a = iota
b
c
)
iota 用法
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //獨(dú)立值珠月,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢復(fù)計(jì)數(shù)
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
結(jié)果
0 1 2 ha ha 100 100 7 8
如果中斷iota自增扩淀,則必須顯式恢復(fù)。且后續(xù)自增值按行序遞增
自增默認(rèn)是int類型啤挎,可以自行進(jìn)行顯示指定類型
數(shù)字常量不會分配存儲空間驻谆,無須像變量那樣通過內(nèi)存尋址來取值,因此無法獲取地址
基本數(shù)據(jù)類型
以下是go中可用的基本數(shù)據(jù)類型
布爾型bool
布爾型的值只可以是常量 true 或者 false庆聘。一個(gè)簡單的例子:var b bool = true
數(shù)值型
整型
- int8 有符號 8 位整型 (-128 到 127)
- int16 有符號 16 位整型 (-32768 到 32767)
- int32 有符號 32 位整型 (-2147483648 到 2147483647)
- int64 有符號 64 位整型 (-9223372036854775808 到 9223372036854775807)
- uint8 無符號 8 位整型 (0 到 255)
- uint16 無符號 16 位整型 (0 到 65535)
- uint32 無符號 32 位整型 (0 到 4294967295)
- uint64 無符號 64 位整型 (0 到 18446744073709551615)
int:根據(jù)底層平臺胜臊,表示32或64位整數(shù)。除非需要使用特定大小的整數(shù)掏觉,否則通常應(yīng)該使用int來表示整數(shù)区端。 大小:32位系統(tǒng)32位,64位系統(tǒng)64位澳腹。 范圍:-2147483648到2147483647的32位系統(tǒng)和-9223372036854775808到9223372036854775807的64位系統(tǒng)织盼。
浮點(diǎn)型
- float32
IEEE-754 32位浮點(diǎn)型數(shù)
- float64
IEEE-754 64位浮點(diǎn)型數(shù)
- complex64
32 位實(shí)數(shù)和虛數(shù)
- complex128
64 位實(shí)數(shù)和虛數(shù)
其他
- byte
類似 uint8
- rune
類似 int32
- uint
32 或 64 位
- int
與 uint 一樣大小
- uintptr
無符號整型,用于存放一個(gè)指針
字符串型
字符串就是一串固定長度的字符連接起來的字符序列酱塔。Go的字符串是由單個(gè)字節(jié)連接起來的沥邻。Go語言的字符串的字節(jié)使用UTF-8編碼標(biāo)識Unicode文本
var str string
str = "Hello World"
運(yùn)算符
算術(shù)運(yùn)算符
+ - * / %(求余) ++ --
關(guān)系運(yùn)算符
== != > < >= <=
邏輯運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
&& | 所謂邏輯與運(yùn)算符。如果兩個(gè)操作數(shù)都非零羊娃,則條件變?yōu)檎?/td> |
丨丨 | 所謂的邏輯或操作唐全。如果任何兩個(gè)操作數(shù)是非零,則條件變?yōu)檎?/td> |
! | 所謂邏輯非運(yùn)算符蕊玷。使用反轉(zhuǎn)操作數(shù)的邏輯狀態(tài)邮利。如果條件為真,那么邏輯非操后結(jié)果為假 |
位運(yùn)算符
A | B | A&B | A丨B | A^B |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
這里最難理解的就是^了垃帅,只要認(rèn)為AB兩者都相同的時(shí)候延届,為0,其他都為1
運(yùn)算 | 描述 | 示例 |
---|---|---|
& | 二進(jìn)制與操作副本位的結(jié)果贸诚,如果它存在于兩個(gè)操作數(shù) | (A & B) = 12, 也就是 0000 1100 |
丨 | 二進(jìn)制或操作副本方庭,如果它存在一個(gè)操作數(shù) | (A 丨 B) = 61, 也就是 0011 1101 |
^ | 二進(jìn)制異或操作副本厕吉,如果它被設(shè)置在一個(gè)操作數(shù)但不能同時(shí)是比特 | (A ^ B) = 49, 也就是 0011 0001 |
? | 二進(jìn)制左移位運(yùn)算符。左邊的操作數(shù)的值向左移動由右操作數(shù)指定的位數(shù) | A ? 2 will give 240 也就是 1111 0000 |
? | 二進(jìn)制向右移位運(yùn)算符械念。左邊的操作數(shù)的值由右操作數(shù)指定的位數(shù)向右移動 | A ? 2 = 15 也就是 0000 1111 |
賦值運(yùn)算符
運(yùn)算符 | 描述 | 示例 |
---|---|---|
= | 簡單的賦值操作符头朱,分配值從右邊的操作數(shù)左側(cè)的操作數(shù) | C = A + B 將分配A + B的值到C |
+= | 相加并賦值運(yùn)算符,它增加了右操作數(shù)左操作數(shù)和分配結(jié)果左操作數(shù) | C += A 相當(dāng)于 C = C + A |
-= | 減和賦值運(yùn)算符龄减,它減去右操作數(shù)從左側(cè)的操作數(shù)和分配結(jié)果左操作數(shù) | C -= A 相當(dāng)于 C = C - A |
*= | 乘法和賦值運(yùn)算符项钮,它乘以右邊的操作數(shù)與左操作數(shù)和分配結(jié)果左操作數(shù) | C *= A is equivalent to C = C * A |
/= | 除法賦值運(yùn)算符,它把左操作數(shù)與右操作數(shù)和分配結(jié)果左操作數(shù) | C /= A 相當(dāng)于 C = C / A |
%= | 模量和賦值運(yùn)算符欺殿,它需要使用兩個(gè)操作數(shù)的模量和分配結(jié)果左操作數(shù) | C %= A 相當(dāng)于 C = C % A |
?= | 左移位并賦值運(yùn)算符 | C ?= 2 相同于 C = C ? 2 |
?= | 向右移位并賦值運(yùn)算符 | C ?= 2 相同于 C = C ? 2 |
&= | 按位與賦值運(yùn)算符 | C &= 2 相同于 C = C & 2 |
^= | 按位異或并賦值運(yùn)算符 | C ^= 2 相同于 C = C ^ 2 |
丨= | 按位或并賦值運(yùn)算符 | C 丨= 2 相同于 C = C 丨 2 |
原文:第2章-基本語法
作者:黎躍春