[TOC]
### 結構體的比較:
* 結構體只能比較是否相等,但是不能比較大小。
* 相同類型的結構體才能夠進行比較,結構體是否相同不但與屬性類型有關,還與屬性順序相關
* 如果 struct 的所有成員都可以比較,則該 struct 就可以通過 == 或 != 進行比較是否相等,比較時逐個項進行比較,如果每一項都相等,則兩個結構體才相等,否則不相等;
~~~
可比較類型:常見的有 bool、數值型、字符、指針、數組
不可比較類型:切片、map、函數
~~~
### 類型設置

### nil賦值
nil 只能賦值給指針、chan、func、interface、map 或 slice 類型的變量
### 類型斷言

只有接口類型才有類型斷言
### cap

channle 的cap就是緩沖,make(chan int,1),cap=1
array 的cap和len 一致
slice 在沒有設置cap時候,和長度一致
### go中字符串是只讀的

### 多重賦值

### const 常量不能取地址

### slice的for range遍歷

如果是map,也是僅輸出索引部分
### 不能使用短變量聲明結構體

### 簡短聲明的變量需要注意啥
* 簡短聲明的變量只能在函數內部使用
* struct 的變量字段不能使用 := 來賦值
* 不能用簡短聲明方式來單獨為一個變量重復聲明, := 左側至少有一個新變量,才允許多變量的重復聲明
### 切片和數組的區別
數組:
1、數組是具有固定長度,且擁有零個或者多個,相同數據類型元素的序列。
2、數組的長度是數組類型的一部分,所以\[3\]int 和 \[4\]int 是兩種不同的數組類型。
3、數組需要指定大小,不指定也會根據初始化的自動推算出大小,不可改變;數組是值傳遞。數組是內置類型,是一組同類型數據的集合,它是值類型,通過從0開始的下標索引訪問元素值。在初始化后長度是固定的,無法修改其長度。
4、當作為方法的參數傳入時將復制一份數組而不是引用同一指針。數組的長度也是其類型的一部分,通過內置函數len(array)獲取其長度
切片:
1、切片表示一個擁有相同類型元素的可變長度的序列。
2、切片是一種輕量級的數據結構,它有三個屬性:指針、長度和容量。
3、切片不需要指定大小;
4、切片是地址傳遞;
5、切片可以通過數組來初始化,也可以通過內置函數make()初始化 。初始化時len=cap,在追加元素時如果容量cap不足時將按len的2倍擴容
### for循環
for 循環支持 continue 和 break 來控制循環,但是它提供了一個更高級的break,可以選擇中斷哪一個循環 for 循環不支持以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變量。
### go語言中的switch語句
單個 case 中,可以出現多個結果選項。只有在 case 中明確添加 fallthrough關鍵字,才會繼續執行緊跟的下一個 case。
### go語言中的引用類型包含哪些
數組切片、字典(map)、通道(channel)、接口(interface)
### go語言的main函數
* main 函數不能帶參數;main 函數不能定義返回值。
* main 函數所在的包必須為 main 包;main 函數中可以使用 flag 包來獲取和解析命令行參數。
### go語言的select機制
* select 機制用來處理異步 IO 問題
* select 機制最大的一條限制就是每個 case 語句里必須是一個 IO 操作
* golang 在語言級別支持 select 關鍵字
### go的接口是什么
* 在 go 語言中,interface 也就是接口,被用來指定一個對象。接口具有下面的要素:
* 一系列的方法
* 具體應用中并用來表示某個數據類型
* 在 go 中使用 interface 來實現多態
### Go語言里面的類型斷言是怎么回事
類型斷言是用來從一個接口里面讀取數值給一個具體的類型變量。類型轉換是指轉換兩個不相同的數據類型。
### Golang Slice的底層實現
切片是基于數組實現的,它的底層是數組,它自己本身非常小,可以理解為對底層數組的抽象。因為基于數組實現,所以它的底層的內存是連續分配的,效率非常高,還可以通過索引獲得數據,可以迭代以及垃圾回收優化。
切片本身并不是動態數組或者數組指針。它內部實現的數據結構通過指針引用底層數組,設定相關屬性將數據讀寫操作限定在指定的區域內。切片本身是一個只讀對象,其工作機制類似數組指針的一種封裝。
切片對象非常小,是因為它是只有3個字段的數據結構:
* 指向底層數組的指針
* 切片的長度
* 切片的容量
這3個字段,就是Go語言操作底層數組的元數據。

### Golang Slice的擴容機制,有什么注意點
首先判斷,如果新申請容量大于 2 倍的舊容量,最終容量就是新申請的容量。否則判斷,如果舊切片的長度小于 1024,則最終容量就是舊容量的兩倍。
否則判斷,如果舊切片長度大于等于 1024,則最終容量從舊容量開始循環增加原來的 1/4 , 直到最終容量大于等于新申請的容量。如果最終容量計算值溢出,則最終容量就是新申請容量。
情況一:原數組還有容量可以擴容(實際容量沒有填充完),這種情況下,擴容以后的數組還是指向原來的數組,對一個切片的操作可能影響多個指針指向相同地址的Slice。
情況二:原來數組的容量已經達到了最大值,再想擴容, Go 默認會先開一片內存區域,把原來的值拷貝過來,然后再執行 append() 操作。這種情況絲毫不影響原數組。
要復制一個Slice,最好使用Copy函數。
### Golang Map底層實現???
Golang 中 map 的底層實現是一個散列表,因此實現 map 的過程實際上就是實現散表的過程。
在這個散列表中,主要出現的結構體有兩個,一個叫hmap(a header for a go map),一個叫bmap(a bucket for a Go map,通常叫其bucket)。
- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker