Go基礎之基礎....[忽略很糟的標題]
Go變量
使用var關鍵字是Go最基本的定義變量方式
//定義一個名稱"carName",類型為"type"的變量
var carName type
//定義多個變量,比如三個變量
var carName1, carName2, carName3 type
定義變量並初始化
//初始化"carName"的變量為value 類型type
var carName type = value
定義多個變量並初始化
var carName1, carName2, carName3 type = v1, v2, v3
定義變量變種(上面繁瑣 於是提供下面方法):
//還是定義三個變量
var carName1, carName2, carName3 = v1, v2, v3
再次改進定義變量方式(因為上面還是感覺繁瑣):
//編譯器會根據初始化的值自動推導出相應的類型
carName1, carName2, carName3 := v1, v2, v3
有人疑惑啦 := 這是什麽鬼啊?!!!
:= 符號取代了var 和type 這種形式叫做簡短聲明。不過它有一個限制只能用在函數內部。全局一般還是第二種 var定義
_(下劃線) 特殊的變量名。任何賦予它的值都會被丟棄
_, a := 1, 2 //賦值時候 1被舍棄了 2 賦值給a
!!!在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 [小路 寫,過去篇]
Go基礎之基礎....[忽略很糟的標題]