日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang 小知识-持续更新中

發布時間:2025/7/25 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 的方式來加工函數。 接口指針:
  • 指針的判斷,都涉及到type和value。
  • 接口指針之間的判等,要基于type與value,一個不同則不等。
  • 接口指針與其對應實現的結構體指針,可以進行判等操作。
  • ------------------------------------------------------------- ------------------------------------------------------------

    ?數組切片內容復制 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?的數據結構定義

    type slice struct {array unsafe.Pointerlen intcap int }

    實際go在append的時候放大cap是有規律的。在?cap?小于1024的情況下是每次擴大到?2 * cap?,當大于1024之后就每次擴大到?1.25 * cap?。

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


    其中?len?和?cap?就是我們在調用?len(slice)?和?cap(slice)?返回的值。

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

    創建數組切片的方式

    1:基于數組

    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():返回數組切片當前所存儲的元素個數

      

    轉載于:https://www.cnblogs.com/hetonghai/p/9059189.html

    總結

    以上是生活随笔為你收集整理的golang 小知识-持续更新中的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。