1、變量
1)變量聲明
格式:var 變量名 變量類型
var v1 int
var v2 string
var v3 [10]int //整型數組
var v4 []int //切片
var v5 struct { //結構
f int
}
var v6 *int //指針
var v7 map[string]int //map,key爲string類型,value爲int類型
var v8 func(a int) int
var ( //多個var 省略爲一個
v1 int
v2 string
)
2)變量初始化
格式1:變量名 = 值 //注:此處的v1必須是已聲明的
v1 = 10
格式2:變量名 := 值 //注:此處的V1必須是未聲明的
v1 := 10
格式3:var 變量名 = 值 //注:該格式爲聲明時直接賦值
var v1 = 10
3)變量賦值
格式:變量名 = 值
v1 = 10
這裏介紹下Go語言的一個小特性
i,j = j,i
上面語句的意思爲將i與j的值對調,如果在Java中實現該賦值,則需要引入臨時變量
4)匿名變量
匿名變量一般在多返回值函數時使用,當調用一個多返回值函數時,爲了只獲取一個值,
又不想給每個返回值都定義一個變量名,此時就可以使用匿名變量,使用“_”來進行佔位
ret1,_:= MutipleReturnFunc()
2、常量
1)字面常量
所謂字面常量是指程序中硬編碼的常量
-12
3.1415926
true
"foo"
2)常量定義
格式:const 常量名 [類型] [= 常量值] //[]表示可以沒有該內容
const Pi float64 = 3.1415926
const zero = 0.0
const (
size int64 = 1024
eof = -1
)
const u,v float64 = 0,3 //u=0.0,v=3.0 常量多重賦值
const mask = 1 << 3 //編譯期行爲表達式,不可以是運行期表達式
3)預定義常量
Go言預定義了三個常量:true、false和iota
iota比較特殊,可以被認爲是一個可被編譯器個性的常量,在每個const關鍵字出現時被重置爲0,
在下個const出現之前,每出現一次iota其所代表的數字會自動增1
const (
Byte = 1 << (10 * iota) //Byte = 1
KB = 1 << (10 * iota) //KB = 1024
MB = 1 << (10 * iota) //MB = 1048576
GB = 1 << (10 * iota) //GB = 1073741824
)
const v1 = iota //0,iota又重設爲0了
注:這裏有一個小特性,在Go中,如果在同一個const第一個常量在定義時進行了賦值,
而後續其它常量沒有進行賦值,則後續常量將延用第一個賦的值或表達式
如下面的定義語句等同於上面的語句
const (
Byte = 1 << (10 * iota) //Byte = 1
KB //KB = 1024
MB //MB = 1048576
GB //GB = 1073741824
)
4)枚舉
Go語言工不支持enum關鍵字來定義枚舉,因此Go語言的枚舉其實只是一系列相關常量
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
3、數據類型(基礎)
Go語言的數據類型包含以下幾種基礎類型和複合類型(將在另外一篇博文中講解)
基礎類型:
1)布爾類型:bool,不支持其它類型的轉換(除使用函數外)
2)整型
int8 :[-128,127]
int16 :[-32768,32767]
int32 :[-2 147 483 648,2 147 483 647]
int64 :[-9 223 372 036 854 775 808,9 223 372 036 854 775 807]
int :依賴不同平臺下的實現,可以是int32(大小)或int64(大小),自動推導
uint8 :又名byte,[0,255]
uint16 :[0,65535]
uint32 :又名rune,[0,4 294 967 295]
uint64 :[0,18 446 744 073 709 551 615]
uint :依賴不同平臺下的實現,可以是uint32(大小)或uint64(大小)
uintprt:恰好容納指針值的類型,對32位平臺是unit32,對64位平臺是unit64
注:不同類型的整型被認爲是不同類型,它們之間無法做賦值、比較運算。
在Go語言中,沒有++與--操作符,僅有"值++"與"值--"語法
如下面的寫法爲錯誤寫法。
var v1 int32
v2 := 64 //v2被自動推導爲int類型
v1 = v2 //不管爲幾位系統均編譯錯誤
v1 = int32(v2) //顯示類型轉換
equal := (v1 == v2) //編譯錯誤
v1++ //正確,中間不能有空格
++v1 //編譯錯誤
3)浮點型:float32 float64(自動推導)
同整型一樣,不同類型的浮點型是被認爲是不同類型他們之間無法做賦值、比較運算。
因爲浮點數不是一種精確的表達方式(計算機爲二進制,二進制無法準確的表示小數),
所以如果直接使用==判斷兩個浮點數是否相等可能會導致不穩定的結果,這裏給出一個替代方案
var v1, v2 float64 = 3.14, 3.14
fmt.Println(v1 == v2) //在這裏,本行打印爲true
fmt.Println(math.Dim(v1, v2) < 0.01) //0.01表示精度,本行打印爲true
4)字符串類型:string
使用""(雙引號,轉義符會被轉義)或者``(反引號,字符保持不變)來創建
字符串類型支持"+="及"+"操作符進行這符串連接
str1 := "Hello" //字符串賦值
str ="Hello\nWorld" //打印str的話,會有換行
str =`Hello\nWorld` //打印結果Hello\nWorld
firstChar := str1[0] //取字符串第一個字符
str1[0] = 'h' //編譯錯誤,字符串的內容不能在初始化後被修改
str := str1 +" World" //字符中連接操作
strLen := lent(str) //字符串長度,這裏的值爲11
strCn :="Hello,世界" //包含中文的字符串
strCnLen := lent(strCn) //字符串長度,這裏的值爲12,在UTF-8中,一箇中文佔三個字節
str +="appendStr" //追加字符串
str ="Hello"+"World" //拼接字符串
str ="Hello"+
"World" //+號不能放在行首
str ="Hello"
+"World" //編譯錯誤
sb := bytes.Buffer{} //使用buffer拼接
sb.WriteString("hello ")
sb.WriteString("world")
str := sb.String()
5)字符類型:
使用''(單引號)創建
byte,實際上是uint8的別名,代表UTF-8字符串的單個字節值
rune,代表單個Unicode字符
6)類型的零值(變量被聲明爲某種類型後的默認值)
通常情況下,數值類型的默認值爲0,bool爲false,string爲空字符串
7)類型轉換
Go語言不支持隱式轉換,所有類型轉換必須顯式聲明,Go是一個類型安全的編程語言
轉換隻有發生在兩種相互兼容的類型之間
格式:ValueA [:]= TypeOfValueA(ValueB)
var a float64 = 1.1
b := int(a) //會發生精度損失
var c bool = false
d := int(c) //編譯錯誤
這裏在講一下比較常見的int->string,string->int,這個無法直接轉換,需要藉助strconv包
str := strconv.Itoa(intV)
intV := strconv.Atoi(str)
至此,基礎類型及使用已經講解完,後續還會有其它的Go語言博文。
這裏也給大家推薦一篇外文的翻譯,《Java程序員快速入門 go 語言》(英文原文:Go for Java programmers),這篇文章對於Java程序員入門Go語言是個好文章。
無聞(unknow)《Go編程基礎》
許式偉的 《Go語言編程》