golang 小知識-持續更新中

Golang 中的指針 - Pointer

Go 的原生數據類型能夠分爲基本類型和高級類型,基本類型主要包含 string, bool, int 及 float 系列,高級類型包含 struct,array/slice,map,chan, func 。
 
相比 Java,Python,Javascript 等引用類型的語言,Golang 擁有相似C語言的指針這個相對古老的特性。但不一樣於 C 語言,Golang 的指針是單獨的類型,而不是 C 語言中的 int 類型,並且也不能對指針作整數運算。從這一點看,Golang 的指針基本就是一種引用。
 
那麼 Golang 爲何須要指針?這種指針又能有什麼獨特的用途呢?
 
在學習引用類型語言的時候,老是要先搞清楚,當給一個函數/方法傳參的時候,傳進去的是值仍是引用。實際上,在大部分引用型語言裏,參數爲基本類型時,傳進去的大都是值,也就是另外複製了一份參數到當前的函數調用棧。參數爲高級類型時,傳進去的基本都是引用。這個主要是由於虛擬機的內存管理致使的。
 
內存管理中的內存區域通常包括 heap 和 stack, stack 主要用來存儲當前調用棧用到的簡單類型數據:string,boolean,int,float 等。這些類型的內存佔用小,容易回收,基本上它們的值和指針佔用的空間差很少,所以能夠直接複製,GC也比較容易作針對性的優化。 複雜的高級類型佔用的內存每每相對較大,存儲在 heap 中,GC 回收頻率相對較低,代價也較大,所以傳引用/指針能夠避免進行成本較高的複製操做,而且節省內存,提升程序運行效率。
 
所以,在下列狀況能夠考慮使用指針:1,須要改變參數的值;2,避免複製操做;3,節省內存;
 
而在 Golang 中,具體到高級類型 struct,slice,map,也各有不一樣。實際上,只有 struct 的使用有點複雜,slice,map,chan 均可以直接使用,不用考慮是值仍是指針。
 
 
struct:
 
對於函數(function),由函數的參數類型指定,傳入的參數的類型不對會報錯。
對於方法(method),接收者(receiver)能夠是指針,也能夠是值,Golang 會在傳遞參數前自動適配以符合參數的類型。也就是:若是方法的參數是值,那麼按照傳值的方式 ,方法內部對struct的改動沒法做用在外部的變量上。
方法是包含了接收者的函數。
函數的格式是固定的,func 函數名 參數 返回值(可選) 函數體。
 
slice :
 
slice 實際上至關於對其依附的 array 的引用,它不存儲數據,只是對 array 進行描述。所以,修改 slice 中的元素,改變會體如今 array 上,固然也會體如今該 array 的全部 slice 上。
能夠使用 make([]int) 來建立並初始化 map 。
   
map :
 
使用 make(map[string]string) 返回的自己是個引用,能夠直接用來操做。
chan :
 
make(chan int) 返回的是能夠直接使用的 channel 。
  
func :
 
在 Golang 中,func 能夠做爲一種值被返回,所以也能夠使用相似 Python 的 decorator 的方式來加工函數。
 
接口指針:
  1. 指針的判斷,都涉及到type和value。
  2. 接口指針之間的判等,要基於type與value,一個不一樣則不等。
  3. 接口指針與其對應實現的結構體指針,能夠進行判等操做。

------------------------------------------------------------- ------------------------------------------------------------html

 數組切片內容複製 copy數組

用於將內容從一個數組切片複製到另外一個數組切片。若是加入的兩個數組切片不同大,就會按其中較小的那個數組切片的元素個數進行復制。數據結構

slice1 := []int{1, 2, 3, 4, 5} 
slice2 := []int{5, 4, 3} 

copy(slice2, slice1) // 只會複製slice1的前3個元素到slice2中 
copy(slice1, slice2) // 只會複製slice2的3個元素到slice1的前3個位置

go 源碼中 slice 的數據結構定義app

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

實際go在append的時候放大cap是有規律的。在 cap 小於1024的狀況下是每次擴大到 2 * cap ,當大於1024以後就每次擴大到 1.25 * cap 。函數

這個是 slice 的數據結構,它很簡單,一個指向真實 array 地址的指針 ptr ,slice 的長度 len 和容量 cap 。post


其中 len 和 cap 就是咱們在調用 len(slice) 和 cap(slice) 返回的值。學習

slice:用來彌補數組的不足,稱之爲數組切片優化

建立數組切片的方式url

1:基於數組spa

var array [10]int = [10]int{1,2,3,4,5,6,7,8,9,10}

var slice []int = array[:5] //基於數組的前5個元素建立數組切片

2:直接建立

slice := make([]int,5,10) //建立一個初始元素個數爲5,初始值爲0,並預留10個元素的存儲                                            空間的數組切片

內置函數:

cap():返回數組切片分配的空間大小

len():返回數組切片當前所存儲的元素個數

相關文章
相關標籤/搜索