這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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語言編程》