這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本文是學習Golang語言的系列文章之一,主要描述go語言的基礎文法,以及進行實踐的相關代碼
Golang關鍵字
Go語言是一門類似C語言的編譯型語言,共有25個關鍵字。
break default func interface select case defer go map struct chan else goto packageswitch const fallthrough if range type continue for import return var
第一個簡單的Go程式
學習任何一門語言,基本都是從輸出簡單的aello world開始的,本文也仍覺得這種方式比較酷,@_@。
本文以GOPATh=/home/xialingsc/go為例,作為代碼空間。在$GOPATH/src下建立main目錄,package mainimport "fmt"func main(){ fmt.Println("Hello World,This is xialingsc");}
解釋:Go是通過package進行組織的,每一個可獨立啟動並執行Go語言程式,必定包含一個package main.在這個main
包中必定包含一個入口函數main,而這個函數沒有參數,也沒有傳回值。Go語言天生支援UTF-8編碼,任何字元
都可以直接輸出,還可以用UTF-8中的任何字元作為標識符。
Go的一些規則
Go採用預設行為而顯得簡潔。
定義變數
格式:var variableName type
//定義多個變數
var v1,v2,v3 string
//定義變數並初始化值
var v1 int = 10
//同時初始化多個變數
var v1,v2,v3 int = 6,7,8
//函數體內的簡單聲明賦值
a,b,c := 8,9,10
//_(底線)是特殊變數名,任何賦予它的值都會被丟棄,為什麼我們還用它?這就是go靈活的表現,在某些
//情境下,擷取的傳回值在接下來的程式沒有實際用處,但如果聲明了而不用,Go會在編譯階段報錯提示。
常量
常量即在編譯階段就確定下來的值,程式運行時無法改變。常量可定義為數值、布爾值或字串等類型。
格式:const constName type = value
例如:const Pi float32 = 3.141516926 或 const Pi = 3.141516926
八種內建基礎類型
Boolean
Go語言中,布爾值的類型為bool,值為true或false ,預設為false。
格式: var variableName bool
數實值型別
(1)整數類型
整數類型分為無符號和帶符號兩種,Go同時支援int 和 uint兩種,這兩種類型長度相同,但具體長度取決於不同
編譯器的實現。
整數類型分為:rune、int8、int16、int32、int64和byte、uint8、uint16、uint32、uint64
byte 是uint8的別稱
注意:這些類型的變數之間不允許互相賦值或操作。儘管int的長度是32bit,預設值為0,但int與int32不能互用。
(2)浮點數類型
浮點類型有兩種,即float32和float64,預設為float64。
另外Go還支援複數,格式為RE+IMi,有兩種,分別是complex64,complex128,預設為complex128
例如:var c complex64 = 10+12ifmt.Printf(“Value is : %v”,c)
字串
-Go中字串都是採用UTF-8字元集編碼,字串是用一對雙引號(““)或反引號(``)來定義,類型為string
格式:var abcstr string = “abc”
-Go中字串是不可變的,例如:abcstr[0] = ‘c’ 會編譯報錯。若真希望進行改變,則可實現為:
newstr := []byte(abcstr) //將字串abcstr轉換為[]byte類型
newstr[0] = ‘c’
abcstr1 := string(newstr)
fmt.Println(“%s \n”,abcstr1)
-可用採用”+”操作符串連兩個字串
-修改字串還可用利用切片(後續會介紹)進行修改
abcstr := “oldstr”
abcstr = “new” + abcstr[3:]
abcstr := `muli string`
錯誤類型
Go中內建了一個error類型,專門來處理錯誤資訊。Go中package還有一個包errors來處理錯誤。
err := errors.New("ceshi errors")if err != nil { fmt.Print(err)}{r endraw %}{% endhighlight %}### iota枚舉Go中有一個關鍵字iota,主要用來聲明enum的時候採用,預設開始值為0,每調用一次加1,若全新聲明另一組enum(即一組新的const),iota從0開始{% highlight %}{% raw %}const ( a = iota //x=0 b = iota //y=1 c //c=2,省略時,預設與前一個值的字面相同 d //d=3)const e = iota //e=0
array數組
格式:var arr [n]type,下標從0開始,數組作為參數傳入函數,其實是值賦值,並非指標,指標可採用slice.
//常規聲明與賦值var a [3]inta[0] = 1fmt.Println("The first number is %d\n",a[0]) //1fmt.Println("The last number is %d\n",a[2]) //0//其他聲明與賦值a := [3]int{1,2,3} //聲明長度為3並賦值b := [5]int{1,2,3} //聲明長度為5,並賦予前三個分別為1,2,3,其他為0c := [...]int{1,2,3} //省略長度,又Go自動根據元素個數來計算長度
Go中支援嵌套數組,即多維陣列
multiArray := [2][3]int{[3]int{1,2,3},[3]int{4,5,6}}由於內外部類型一致,均為int,則可以省略為:multiArray := [2][3]int{{1,2,3},{4,5,6}}例如:dobuleArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}fmt.Println("The first element of DobuleArray is %d:", dobuleArray[0][0])fmt.Println("The last element of DobuleArray is %d:", dobuleArray[1][3])
slice
這是Go語言具有的特性之一,是具有動態數組特性的參考型別,滿足初始定義時並不知道需要多大的數組情境。
格式:var sliceArr []type ,比array少了類型長度
例如:buf := []byte{‘a’,’b’,’c’}
slice可以從一個數組或一個已存在的slice中再次聲明,通過array[i:j]來擷取,i為開始位置,j為結束位置
但不包含array[j],長度為j-i
//聲明一個長度為10個元素類型為byte的數組var initArray = [10]byte{'a','b','c','d','e','f','g','h','i','j'}//聲明兩個byte的slicevar aslice,bslice []byte//指向數組不同位置aslice = initArray[2:5] //aslice則包含initArray[2],initArray[3],initArray[4]bslice = initArray[3:5] //bslice則包含initArray[3],initArray[4]
slice的簡便操作
預設開始位置為0,initArray[:2]等價與initArray[0:2]slice第二個序列預設是數組的長度,initArray[2:]等價於initArray[2:len(initArray)]initArray[:] 等價於 initArray[0,len(initArray)]slice的長度len與容量cap是不同的概念,後者是指從slice指定的位置開始,一直到原數組的最後一個值因為slice是參考型別,所以引用改變原來值後,其他的所有引用也都會改變該值從概念上而言,slice像一個結構體,這個結構體包含了三個元素,一個指標,長度len及最大長度capslice內建函數:len,cap,append(追加,然後返回同類型slice),copy(從源slice的src複製元素到目標dst,並返回複製的元素的個數用法:slice := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'}copySlice := []byte{'x', 'y', 'z'}copy(slice, copySlice)fmt.Printf("The Element of copySlice is %s\n", copySlice)fmt.Printf("The Element of slice is %s\n", slice)sliceEven := make([]int, 0)sliceEven = append(sliceEven, 1, 2, 3, 4, 5)
map
格式:map[keyType]valueType
map的讀取和設定與slice一樣,通過key操作,只是slice的index是int
類型,而map多了其他類型
可以為int,string及所有定義了==與!=操作的類型
//聲明一個key是字串,值為int的map,使用前必須使用make初始化
var dictionary map[string]int
dictionary = make(map[string]int)
//另一種map的聲明方式,採用make初始化
numbers := make(map[string]int)
numbers[“one”] = 1 //賦值
fmt.Println(“測試輸出:”,numbers[“one”])
使用map需要注意的幾點內容:
map是無序的,每次列印輸出都不一樣map 長度不固定,屬於參考型別內建len函數,返回map擁有的key的數量修改map的值,可以直接numbers["one"] = 12map初始化可以通過key:val方式實現,map內建有判斷是否存在key的方式,通過delete刪除map的元素//初始化一個maprating := map[string]float32{"c": 5, "FO": 3.4, "python": 2.3}ratingvalue, ok := rating["c#"]if ok { fmt.Println("c is in the map and it's value is:%d\n", ratingvalue)} else { fmt.Println("c isn't in the map")}//刪除delete(rating, "c")fmt.Println("itretor map start:")for _, value := range rating { fmt.Println("the element of map is %s", value)}
make及new操作
make用於內建類型(map,slice,channel)的記憶體配置
new用於各種類型的記憶體配置,new 返回指標,new(T)分配了零值填充的T類型記憶體空間,返回一個*T類型的值
make(T,args)與new(T)的區別:
make只能建立slice,map和channel,並返回一個有初始值(非零)的T類型,而不是*T.make返回初始化後的(非零)值.
常用類型變數未填充前的預設值int 0int8 0int32 0int64 0uint .0x0rune 0 //rune實際類型為int32byte 0x0 //byte實際是uint8float32 0 //長度為4 bytefloat64 0 //長度為 8bytebool false string ""