一、簡(jiǎn)介
- Go(又稱Golang)是Google開發(fā)的一種靜態(tài)、強(qiáng)類型膊存、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言
二隔崎、變量 & 常量
2.1 變量
- 聲明
var name type
- 變量聲明后今艺,會(huì)自動(dòng)初始化
int 為 0,float 為 0.0爵卒,bool 為 false虚缎,string 為空字符串,指針為 nil
- 命名規(guī)則遵循駱駝命名法
var a, b int
var p *int
var f int = 99
//批量
var (
c int
d string
)
//簡(jiǎn)寫
s := "string"
x, y := 1.0, 2.0
//值交換
x, y = y, x
fmt.Println(a, b, f, c, d, p, s, x, y) //0 0 99 0 <nil> string 2 1
- 匿名變量
func getPoint() (int, int) {
return 100, 200
}
xPoint, _ := getPoint()
_, yPoint := getPoint()
fmt.Println(xPoint, yPoint)
2.2 常量
-
const
關(guān)鍵字 - 只能是布爾型钓株、數(shù)字型(整數(shù)型实牡、浮點(diǎn)型和復(fù)數(shù))和字符串型
- 定義常量的表達(dá)式必須為能被編譯器求值的常量表達(dá)式
- 聲明,類型可選
const name [type] = value
- iota
三轴合、基本數(shù)據(jù)類型
3.1 布爾型
- 關(guān)鍵字
bool
- 值僅有
true
orfalse
- 默認(rèn)值
false
- 存在短路行為创坞,既如果運(yùn)算符左邊的值可以確定整個(gè)布爾表達(dá)式的結(jié)果,則運(yùn)算符右邊不再執(zhí)行(同其他語(yǔ)言)
3.2 字符串
- 關(guān)鍵字
string
- 默認(rèn)值為空
- 值為任意數(shù)據(jù)的不可變字節(jié)序列
- UTF-8 字符占位(ASCII上的字符占一個(gè)字節(jié)受葛,其他占兩個(gè)字節(jié))
- 轉(zhuǎn)義字符
\n
換行符
\r
回車符
\t
tab 鍵
\u 或 \U
Unicode 字符
\\
反斜杠自身 - 比較運(yùn)算符(==题涨、!=、<总滩、<=纲堵、>=、>)
- 獲取大小
len()
- 字符串操作闰渔,借助于
strings
包
str1 := "!"
//拼接
str := "Hello world" + str1
//索引
fmt.Println(str[0]) //72
//截取(取前不取后)
fmt.Println(str[0:4]) //hell
//是否包含
fmt.Println(strings.Contains(str, "hello")) //true
fmt.Println(strings.Contains(str, "h & k")) //false
//是否包含多個(gè)
fmt.Println(strings.ContainsAny(str, "h & k")) //true
//是否以子串開始
fmt.Println(strings.HasPrefix(str, "hello")) //true
//是否以子串結(jié)束
fmt.Println(strings.HasSuffix(str, "!")) //true
//大小寫
fmt.Println(strings.ToLower(str)) //hello world!
fmt.Println(strings.ToUpper(str)) //HELLO WORLD!
//獲取索引,查找不到返回-1
fmt.Println(strings.Index(str, "l")) //2
fmt.Println(strings.LastIndex(str, "l")) //9
//匹配多個(gè)字節(jié)組成的字符
fmt.Println(strings.IndexRune("城市花園", '花')) //6
//切片
fmt.Println(strings.Split(str, " ")) //[Hello world!]
//組合(元素類型為string)
fmt.Println(strings.Join(strings.Split(str, " "), " ")) //Hello world!
fmt.Println(strings.Join([]string{"a", "b", "c"}, ", ")) //a, b, c
//替換(參數(shù):源字符串席函,需要替換, 新字符串澜建, 匹配前n個(gè)記錄)
fmt.Println(strings.Replace(str, "world", "Jony", 1)) //Hello Jony!
- 多行時(shí)必須使用反引號(hào)
`
向挖,既字符串字面量
var s string = `First line
hello
end line
`
- 類型轉(zhuǎn)換,
strconv
包
num, _ := strconv.Atoi("10")
fmt.Println(num-1) //9
3.3 數(shù)值類型
整數(shù)
- 有符號(hào)
int炕舵、int8何之、int16、int32咽筋、int64 - 無符號(hào)
uint溶推、uint8、uint16奸攻、uint32蒜危、uint64、uintptr
注:int和uint會(huì)因編譯器和計(jì)算機(jī)硬件睹耐,大小會(huì)在 32bit 或 64bit 之間變化
浮點(diǎn)數(shù)
- float32 EEE-754 32位浮點(diǎn)型數(shù)
- float64 IEEE-754 64位浮點(diǎn)型數(shù)
復(fù)數(shù)
- complex64 32 位實(shí)數(shù)和虛數(shù)
- complex128 64 位實(shí)數(shù)和虛數(shù)
四辐赞、派生類型
4.1 指針(pointer)
- 聲明
var var_name *var-type
- 取地址操作符
&
- 指針變量取指向地址保存數(shù)據(jù)操作符
*
-
fmt.Printf
打印內(nèi)存地址%f
- 類型指針,允許對(duì)這個(gè)指針類型的數(shù)據(jù)進(jìn)行修改硝训,傳遞數(shù)據(jù)可以直接使用指針响委,而無須拷貝數(shù)據(jù)新思,類型指針不能進(jìn)行偏移和運(yùn)算
data := "pointer data"
ptr := &data
fmt.Printf("%p\n", &data) //0xc00008a040
fmt.Println(ptr) //0xc0000681e0
fmt.Println(*ptr) //pointer data
str := new(string)
*str = "string data"
fmt.Printf("%p\n", str) //0xc000098050
fmt.Printf("%s\n", *str) //string data
//空指針取值會(huì)報(bào)錯(cuò)
var nullPointer *string
if(nullPointer == nil) {
fmt.Println(nullPointer) //<nil>
}
4.2 數(shù)組
- 聲明
var 數(shù)組變量名 [元素?cái)?shù)量]Type
- 定長(zhǎng)特定類型的元素序列
var intArr [3]int
var arr1 [3]int = [3]int{1, 2}
arr2 := [...]int{1, 2, 0}
arr3 := [2]int{1, 2}
fmt.Println(intArr) //[0 0 0]
fmt.Println(arr1) //[1 2 0]
fmt.Println(arr2) //[1 2 0]
fmt.Println(arr1 == arr2) //true
// fmt.Println(arr1 == arr3) //error
//數(shù)組遍歷
for k, v := range arr3 {
fmt.Println(k, v)
}
//多維數(shù)組
var multArr [2][3]int
//此種方式初始化一行的元素可以省略自動(dòng)使用默認(rèn)值,但不能省略一行否則報(bào)錯(cuò)
multArr = [2][3]int{{1, 2, 3}, {4, 5}} //[[1 2 3] [4 5 0]]
fmt.Println(multArr)
multArr1 := [4][3]int{1:{1, 1, 1}, 3:{3, 3, 3}}
fmt.Println(multArr1) //[[0 0 0] [1 1 1] [0 0 0] [3 3 3]]
fmt.Println(multArr1[3]) //[3 3 3]
multArr1[2][1] = 99
fmt.Println(multArr1) //[[0 0 0] [1 1 1] [0 99 0] [3 3 3]]
4.3 切片
- 切片(slice)是對(duì)數(shù)組的一個(gè)連續(xù)片段(整個(gè)數(shù)組赘风,由起始和終止索引標(biāo)識(shí)的一些項(xiàng)的子集)的引用(對(duì)數(shù)組的抽象)
- 切片結(jié)構(gòu)包含地址夹囚、大小和容量
- 大小不固定
- 聲明
var name []Type
//從數(shù)組中生成切片
arr := [...]int{1, 2, 3, 4, 5}
fmt.Println(arr) //[1 2 3 4 5]
fmt.Println(arr[0:0]) //[]
fmt.Println(arr[:]) //[1 2 3 4 5]
fmt.Println(arr[2:]) //[3 4 5]
fmt.Println(arr[:2]) //[1 2]
fmt.Println(arr[1:3]) //[2 3]
//聲明切片
var strSlice []string
var intSlice []int
var emptySlice = []int{} //分配到了內(nèi)存,但無元素
fmt.Printf("%p, %p, %p\n", strSlice, intSlice, emptySlice) //0x0, 0x0, 0x1195ab8
fmt.Println(strSlice, intSlice, emptySlice) //[] [] []
fmt.Println(strSlice == nil) //true
fmt.Println(emptySlice == nil) //false
//append()函數(shù)添加元素邀窃,返回一個(gè)切片
fmt.Println(append(intSlice, 1)) //[1]
fmt.Println(append(intSlice, 1, 2)) //[1 2]
//追加的為切片時(shí)需解包
fmt.Println(append(intSlice, []int{1, 2, 3}...)) //[1 2 3]
//使用 make() 內(nèi)建函數(shù),動(dòng)態(tài)地創(chuàng)建一個(gè)切片
s1 := make([]int, 2)
s2 := make([]int, 2, 6)
fmt.Println(s1, s2) //[0 0] [0 0]
//copy
slice1 := []int{1, 1, 1}
slice2 := []int{2, 2, 2, 2, 2}
copySlice1 := make([]int, 5)
copySlice2 := make([]int, 3)
copy(copySlice1, slice1)
copy(copySlice2, slice2)
fmt.Println(copySlice1) //[1 1 1 0 0]
fmt.Println(copySlice2) //[2 2 2]
4.4 Map
- 聲明
var mapname map[keytype]valuetype
make
聲明可選標(biāo)明大小make(map[keytype]valuetype, cap)
- 僅只讀線程安全
var emptyMap map[string]int
emptyMap1 := make(map[string]int, 10)
fmt.Println(emptyMap, emptyMap1) //map[] map[]
mapList := map[string]int{"key1":1, "key2":2}
fmt.Println(mapList, len(mapList)) //map[key1:1 key2:2] 2
mapList["key3"] = 3
for key, value := range mapList {
fmt.Println(key, value)
}
//刪除
delete(mapList, "key2")
fmt.Println(mapList) //map[key1:1 key3:3]
value 值
- 實(shí)測(cè)為
Map
或者切片
時(shí)正確荸哟,為數(shù)組時(shí)報(bào)錯(cuò)
type Rcus struct {
Id bson.ObjectId
RoomNum string
AirconMap map[string][]int
DmMap map[string]int
}
rcu := new(models.Rcus) //已經(jīng)初始化各個(gè)成員
// rcu := &(models.Rcus)
rcu.Id = bson.NewObjectId()
rcu.RoomNum = "1204"
//正確
// ariconMap := make(map[string][]int)
// aircon1 := []int{1, 2, 3, 4}
// ariconMap["AC1"] = aircon1
// ariconMap["AC2"] = []int{1, 2, 3, 4}
// rcu.AirconMap = ariconMap
//正確
// aircon := []int{1, 2, 3, 4}
// rcu.AirconMap = map[string][]int{"ac":aircon}
rcu.DmMap = map[string]int{"1":1}
fmt.Println(rcu)
sync.Map
- 優(yōu)于加鎖解決map線程安全,sync 包下的特殊結(jié)構(gòu)
- 無須初始化瞬捕,直接聲明即可
//sync package
var syncMap sync.Map
//存儲(chǔ)
syncMap.Store("key1", 1)
syncMap.Store("key2", 2)
syncMap.Store("key3", 3)
//獲取值
fmt.Println(syncMap.Load("key2")) //2 true
//刪除
syncMap.Delete("key3")
//遍歷
syncMap.Range(func(k, v interface{}) bool {
fmt.Println(k, v)
return true //true 繼續(xù)鞍历,false 結(jié)束
})
其他:函數(shù)、Channel山析、接口堰燎、結(jié)構(gòu)體
四掏父、常用標(biāo)準(zhǔn)庫(kù)
包名 | 功能 |
---|---|
bufio | 帶緩沖的 I/O 操作 |
bytes | 實(shí)現(xiàn)字節(jié)操作 |
container | 封裝堆笋轨、列表和環(huán)形列表等容器 |
crypto | 加密算法 |
database | 數(shù)據(jù)庫(kù)驅(qū)動(dòng)和接口 |
debug | 各種調(diào)試文件格式訪問及調(diào)試功能 |
encoding | 常見算法如 JSON、XML赊淑、Base64 等 |
flag | 命令行解析 |
fmt | 格式化操作 |
go | Go語(yǔ)言的詞法爵政、語(yǔ)法樹、類型等陶缺〖匦可通過這個(gè)包進(jìn)行代碼信息提取和修改 |
html | HTML 轉(zhuǎn)義及模板系統(tǒng) |
image | 常見圖形格式的訪問及生成 |
io | 實(shí)現(xiàn) I/O 原始訪問接口及訪問封裝 |
math | 數(shù)學(xué)庫(kù) |
net | 網(wǎng)絡(luò)庫(kù),支持 Socket饱岸、HTTP掺出、郵件、RPC苫费、SMTP 等 |
os | 操作系統(tǒng)平臺(tái)不依賴平臺(tái)操作封裝 |
path | 兼容各操作系統(tǒng)的路徑操作實(shí)用函數(shù) |
plugin | Go 1.7 加入的插件系統(tǒng)汤锨。支持將代碼編譯為插件,按需加載 |
reflect | 語(yǔ)言反射支持百框∠欣瘢可以動(dòng)態(tài)獲得代碼中的類型信息,獲取和修改變量的值 |
regexp | 正則表達(dá)式封裝 |
runtime | 運(yùn)行時(shí)接口 |
sort | 排序接口 |
strings | 字符串轉(zhuǎn)換铐维、解析及實(shí)用函數(shù) |
time | 時(shí)間接口 |
text | 文本模板及 Token 詞法器 |