go語言學習小結(一)
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。學習go。記錄下
1),package、import
這兩個功能在現在的很多語言(java、C#)都具備了。這裡面引入包在C家族確實是個很好的東西,使得程式碼群組織更清晰;import而不是include標頭檔,完全剔除了c家族的弊病。
2),變數命名風格的改變
定義變數:
var i int跟C家族文法int i;相去甚遠,貌似更接近delphi、javascript、scala風格。當然在文法分析中這樣定義變數比C風格的定義是更容易識別的。
類型推導:
類型推導在很多函數語言(scala、f#等)是必須滴,當然C#為了推出lambda運算式也實現了這個功能,不過java現在還沒有。需要注意的是go中類型推導只能用在函數裡面。來看看 var i int=11的等價寫法 i := 11。
同時給多個變數賦值:
lua可以給多個變數賦值的,go也有而且文法幾乎一樣滴 a,b,c := 1,2,3 ,如果寫成 a,_:=1,2 那麼2就自動丟掉。
有了這個功能交換變數一句話就搞定了 a,b =b,a。
定義多個變數:
如果是定義相同類型的變數可以這樣 var i,j int 跟C差不多 int i,j;
如果是多個不同類型的變數那是這樣
var (
i int
s string
)
定義數組:
定義數組跟定義變數稍微變一變 var array [8]int
還可以這樣寫 array :=[...]int{0,1,2,3,4,5,6,7}。
擷取數組長度 len(array),而不是C家族的array.length
3),go內建資料類型
slices:
上面定義的數組大小是無法改變的。如果要動態那就要這樣 array :=make([]int,8) 或者這樣是
var array []int array =make([]int,8)
[n:m]訪問符
[n:m]同樣也適用於數組的。用array[n:m](n、m是數組下標)將返回一個從n到m-1的slices。
如果寫成[n:]則等價於[n:len(array)]
array :=[...]int{0,1,2,3,4,5,6,7}
array2 :=array[2:4] //返回{2,3}
cap函數
cap 用於擷取數組的容量。
append函數
在一個slices或數組後追加元素,產生一個新slices。
array := [...]int{0,1,2,3,4,5,6,7}。
array1 := array=append(array,8,9,10);//添加的資料(8、9、10)是一個可變參數
copy函數
n = copy(des ,src)。n等於拷貝元素個數。
array := [...]int{0,1,2,3,4,5,6,7}。
array1 := make( []int,5)
copy(array1,array[0:5])
map :
go中內建了map資料結構。定義一個map是這樣的 var m map[kType]vType。vType是map關鍵字儲存的值的類型,kType是關鍵字的資料類型。map的建立也是需要用make函數來建立的 m=make(map[int]string) ,這裡建立關鍵字類型為int,值類型為string的map。如果map的值是知道的,那麼可以用這樣 m:=map[int]String{
1:"A",
2:"B",
3:"C",
... }
注意map裡每個元素逗號後一定要換行。
map增加元素 m[4]="d" ;
map去除元素 delete(m,4)
map判斷存在 val,exists :=m[4]
很多人對go在語言層面內建slices和map持歡呼的態度,go為了內建slices(map)還添加關鍵字(go號稱很吝嗇關鍵字滴)。lua、python等語言都內建了很有特色的資料類型,go走的是一條方向(ruby、python的開發人員爽了吧)。也許真如go的開發人員說的slices(map)是輕量快速的。
4),控制語句
go裡控制語句精簡了(去除了while、do)不少而更靈活了。
A),if語句。if在條件運算式內不用加圓括弧,但強制加大括弧。變化點if的條件表達可以有初始化語句
if a:=1; a==0{}
B),for語句
for 運算式; 條件; 運算式{} 典型的C家族for
for 條件{} C家族while的替代
for{} 死迴圈
for和關鍵字range結合遍曆數組、slices、map。類似於js的for in、java 的for(val : list.values())、C#的foreach.
for key,value range array{} C),switch。明顯的差別是go的switch case裡不用謝braek。
C1,case可以有條件運算式
a:=1
swich{
case a>0&& a<10:
//dosomething
default:
//dosomething
}
C2,case 連續匹配
swich a{
case 1,2,3:
//dosomething
default:
//dosomething
}
C2,fallthrough.新關鍵字fallthrough讓當前case匹配到下一個case裡。。
swich a{
case 1:fallthrough
case 2:fallthrough
case 3:fallthrough
//dosomething
default:
//dosomething
}
C3,go的switch也有if語句一樣的初始化語句
swich a:=1;a{}