Go變量
使用var關鍵字是Go最基本的定義變量方式數組
//定義一個名稱"carName",類型爲"type"的變量
var carName typeapp
//定義多個變量,好比三個變量
var carName1, carName2, carName3 type函數
定義變量並初始化
//初始化"carName"的變量爲value 類型type
var carName type = valueui
定義多個變量並初始化編碼
var carName1, carName2, carName3 type = v1, v2, v3spa
定義變量變種(上面繁瑣 因而提供下面方法):
//仍是定義三個變量
var carName1, carName2, carName3 = v1, v2, v3設計
再次改進定義變量方式(由於上面仍是感受繁瑣):
//編譯器會根據初始化的值自動推導出相應的類型
carName1, carName2, carName3 := v1, v2, v33d
有人疑惑啦 := 這是什麼鬼啊?!!!
:= 符號取代了var 和type 這種形式叫作簡短聲明。不過它有一個限制只能用在函數內部。全局通常仍是第二種 var定義指針
_(下劃線) 特殊的變量名。任何賦予它的值都會被丟棄
_, a := 1, 2 //賦值時候 1被捨棄了 2 賦值給ablog
!!!在Go 若是聲明一個變量 可是最終沒使用 會在 編譯時候報錯
Go常量
常量,字如其名,在編譯階段就肯定的值,在程序運行時沒法改變的值
常量:可定義爲 數值,布爾值,字符串
/定義一個數字爲 168
const a = 168
從上面例子就能推出常量語法: const constantName = value ---> const xxx(常量名) = xx(常量值)
內置基礎類型
Boolean
在Go中, 布爾值的類型爲bool 值是true或者false 默認爲false
數值類型:
整數類型有無符號和帶符號兩種。Go同時支持int和uint 兩種類型長度
!!! 類型的變量之間不容許互相賦值或操做 ,不然編譯時報錯
字符串:
Go中字符串採用utf-8字符集編碼 類型string 在"" 或者''中包裹
!!! Go字符串是不能夠改變的
錯誤類型
Go內置一個error類型 處理錯誤信息
技巧:
1.分組聲明
在Go語言中,同時能夠聲明多個常量、變量、或者導入包可以使用分組方式
!!!在定義分組常量時候要注意iota
2.iota枚舉
Go裏有一個關鍵字iota 這個關鍵字聲明enum時採用 默認值0 每次調用+1
3.GO程序設計規則
!!!要記住規則 。一個良好的開始就是從熟悉規則
---大寫字母開頭的變量是能夠被其餘包讀取的 是公用變量
---小寫字母開頭是不能夠被其餘包讀取的是私有變量
---函數同理也是同樣大寫字母開頭至關於public,小寫至關於private
array slice map
array:就是數組 -->用法 var arr [n] type //在[n]type中,n表示長度 ,type表示類型
var arr [5] int //聲明一個int類型的數組
arr [0] = 42 //數組下標0 賦值42 同時數組也是下標從0開始的
另外一種簡化聲明:
a := [3] int{1, 2, 3} //聲明一個長度爲3的int數組
b := [5] int{1, 2} //聲明長度爲5的數組 初始賦值1,2 其餘沒賦值元素默認爲0
c := [...] int{1,2} //省略長度... go自動根據數據計算長度
GO數組嵌套
二維數組:doubleArray := [2][4] int{}
slice:在不少場景中數組並不能知足需求。在初始蒂尼數組時,咱們不知道須要多大數組 -->動態數組 slice 切片
slice不是真的動態數組是一個引用類型。
slice老是指向一個底層array,slice聲明能夠像array同樣 只是不須要長度
var aslice [] int -->發現[]中沒有數字吧
咱們能夠聲明一個slice並初始化
slice := []byte {'a', 'b', 'c', 'd'}
!!!slice和數組在聲明時區別 :聲明數組方括號是有數組的長度或者使用[...]自動計數的,聲明slice是沒有任何字符
slice 的默認開始是從0 ar[:n] --->ar[0:n]
slice 的第二個序列默認是數組的長度 ar[n:] --->[n:len(ar)]
若是從一個數組裏直接獲取slice 能夠 ar[:] --->[0:len(ar)]
!!!slice是引用類型 若是引用改變其中元素值時,其餘引用也會改變
slice像一個結構體{一個指針 長度 最大長度}
slice: len ---->獲取slice的長度
cap ---->獲取slice的最大容量
append ->向slice裏追加一個或者多個元素返回一個和slice同樣的類型的slice
copy --->copy從源slice的src中複製元素到目標dst 並返回賦值元素的個數
!!!append 會改變slice所引用數組的內容 ,從而影響其餘引用同一數組的其餘slice。若是slice沒有剩餘空間追加的元素會動態分配
到新的空間這樣原數組的容易保持不變;其餘引用數組的slice也不受影響
map:
map[keyType] valueType
map讀取和設置都和slice同樣 經過key來操做可是他們最大區別是:slice的index只能是int類型 ,而map的key是不少類型均可以
//聲明key是字符串,int值 須要使用前初始化
var number map[string] int
//另外一種聲明方法
numbers := make(map[string] int)
numbers ["one"] = 1 //賦值
//map 左邊是key 右邊是value
!!!-map是無序的,每次打印出來的map都會不同因此只能經過key取
-map長度是不固定的和slice同樣是引用類型
-len同樣適用於map 返回map個數
-map值很容易修改經過key
-map初始化能夠經過key:val,map內置機制判斷是否存在key
經過delete刪除map的元素:
delete(rating,"key")
make/new
make: 用於內建類型(map、slice和channel)內存分配
new: 用於各類類型的內存分配
區別:make只能建立3種 而且會初始化 返回的有初始值的T類型 。new建立各類可是返回的是地址 即指針
--2017年12月22日19:58:31 [小路 寫,過去篇]