6 Go的切片

概述

????????在上一節的內容中,我們介紹了Go的數組,包括:聲明數組、初始化數組、訪問數組元素等。在本節中,我們將介紹Go的切片。在Go語言中,數組的長度是固定的,不能改變,這在某些場景下使用不太方便。切片(slice)是一種動態數組,它提供了更為靈活和便捷的方式來操作數組。切片是對數組的抽象,它包含了指向數組元素的指針、切片的長度和容量。

聲明切片

????????切片的聲明使用[]操作符,語法如下:

??????????var sliceName []Type

????????其中,sliceName表示切片的名稱,Type表示切片中元素的類型。與數組不同,聲明切片時,不需要指定長度。

????????在下面的示例代碼中,我們聲明了一個名為numbers的整數類型切片,并初始為空切片。

var numbers []int

初始化切片

????????可以使用數組來初始化切片,語法如下:

??????????var sliceName []Type = []Type{value1, value2, ..., valueN}

????????其中,Type表示切片中元素的類型,value1、value2、...、valueN是切片中元素的初始值。

????????在下面的示例代碼中,我們創建了一個包含3個整數的切片,其初始值為1、2、3。還創建了一個包含2個字符串的切片,其初始值為“Hello”、“CSDN”。

package mainimport "fmt"func main() {var numbers []int = []int{1, 2, 3}text := []string{"Hello", "CSDN"}// 輸出:[1 2 3]fmt.Println(numbers)// 輸出:[Hello CSDN]fmt.Println(text)
}

????????我們還可以使用內置函數make()來初始化切片,傳入類型、數量、容量(可忽略)即可,元素的初始值為類型的默認值。

package mainimport "fmt"func main() {var numbers []int = make([]int, 3)text := make([]string, 2)// 輸出:[0 0 0]fmt.Println(numbers)// 輸出:[ ]fmt.Println(text)
}

????????與數組相比,切片的長度是不固定的,可以追加元素。在追加時,可能使切片的容量增大。切片的長度可以由 len()函數獲取,容量可以由cap()函數獲取。

package mainimport "fmt"func main() {var numbers []int = make([]int, 3, 10)// 輸出:3 10fmt.Println(len(numbers), cap(numbers))
}

????????如果切片聲明后,沒有初始化,則為空切片。空切片默認為nil,其長度和容量均為0。

package mainimport "fmt"func main() {var numbers []int// 輸出:0 0fmt.Println(len(numbers), cap(numbers))if numbers == nil {// 輸出:[]fmt.Println(numbers)}
}

切片的切割

????????在Go語言中,可以使用切片的切片操作來切割切片。切片的切片操作可以用來獲取切片的一部分,或者將一個切片分割成多個子切片。切片的切片操作使用兩個索引來指定切割的位置:第一個索引指定切割的起始位置,第二個索引指定切割的結束位置,但不包括該位置的元素。第一個索引不指定時,默認為0。第二個索引不指定時,默認為切片的長度。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5, 6}// 輸出:[3 4 5 6]fmt.Println(numbers[2:])// 輸出:[1 2 3 4]fmt.Println(numbers[:4])// 輸出:[3 4]fmt.Println(numbers[2:4])// 輸出:[1 2 3 4 5 6]fmt.Println(numbers[:])
}

切片的添加

????????可以使用append()函數向切片添加一個或多個元素。append()函數會根據切片的容量和長度,自動調整底層數組的大小,并將新元素添加到切片的末尾。注意:append()函數會返回一個新的切片,包含添加元素后的結果;因此,需要將返回的結果重新賦值給原切片,以更新切片的內容。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3}// 添加元素99和100到切片的末尾numbers = append(numbers, 99, 100)// 輸出:[1 2 3 99 100]fmt.Println(numbers)
}

????????當向一個切片添加另一個切片的所有元素時,使用append()函數需要對第二個切片進行解包(切片后面添加符號...,用于展開切片中的元素),可參考下面的示例代碼。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3}numbers2 := []int{99, 100}// 添加另一個切片,需要解包numbers = append(numbers, numbers2...)// 輸出:[1 2 3 99 100]fmt.Println(numbers)
}

切片的刪除

????????切片的刪除分為幾種情況:從頭部刪除、從中間刪除、從尾部刪除。

????????刪除開頭的元素時,可以直接移動數據指針。假如有一個切片slice,則slice[1:]會刪除開頭1個元素,slice[N:]會刪除開頭N個元素。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}// 刪除開頭2個元素numbers = numbers[2:]// 輸出:[3 4 5]fmt.Println(numbers)
}

????????也可以不移動數據指針,但將后面的數據向開頭移動,此時可用append()函數原地完成。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}// 刪除開頭2個元素numbers = append(numbers[:0], numbers[2:]...)// 輸出:[3 4 5]fmt.Println(numbers)
}

????????刪除中間的元素時,需要對剩余元素進行一次整體移動,此時仍可用append()函數原地完成。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5, 6}// 刪除中間的3、4兩個元素numbers = append(numbers[:2], numbers[4:]...)// 輸出:[1 2 5 6]fmt.Println(numbers)
}

????????刪除尾部的元素時,直接切割即可。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5, 6}// 刪除尾部的兩個元素numbers = numbers[:len(numbers) - 2]// 輸出:[1 2 3 4]fmt.Println(numbers)
}

切片的復制

????????可以使用copy()函數來復制切片,它接受兩個參數:第一個參數是目標切片,第二個參數是源切片。copy()函數會將源切片中的元素復制到目標切片中,并返回實際復制的元素個數。注意:如果源切片和目標切片不一樣大,則會按照其中較小的那個切片的元素個數進行復制。另外,切片的復制不是在末尾添加元素,而是從開頭位置覆蓋之前已經存在的元素。

package mainimport "fmt"func main() {slice1 := []int{1, 2, 3, 4, 5}slice2 := []int{66, 88, 99}// slice2的容量小,故只會復制slice1的前3個元素到slice2中copy(slice2, slice1)// 輸出:[1 2 3]fmt.Println(slice2)slice2 = []int{66, 88, 99}copy(slice1, slice2)// 輸出:[66 88 99 4 5]fmt.Println(slice1)
}

切片的遍歷

????????有兩種方法來實現切片的遍歷:一是使用for循環,二是使用range關鍵字。

????????在下面的示例代碼中,我們使用了一個for循環,從切片的索引0開始遍歷到切片的長度減1。通過索引,我們可以訪問切片中的每個元素,并打印出來。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}for i := 0; i < len(numbers); i++ {fmt.Println(numbers[i])}
}

????????在下面的示例代碼中,我們使用了range關鍵字來遍歷切片。每次迭代時,range會返回當前元素的索引和值。我們可以使用它們來訪問切片中的元素,這種方法更加簡潔和易讀。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}for index, value := range numbers {fmt.Println(index, value)}
}

多維切片

????????多維切片是由一系列切片組成的,每個切片可以具有不同的長度和容量。要創建一個多維切片,首先需要創建一個初始切片。然后使用該切片來創建額外的切片,每個新切片都會將原始切片的元素拆分為更小的切片。

????????聲明一個多維切片的語法格式如下:

??????????var sliceName [][]...[]Type

????????其中,sliceName表示切片的名稱,Type表示切片的類型,每個[]代表著一個維度,切片有幾個維度就需要幾個[]。

????????在下面的示例代碼中,我們首先創建了一個初始切片slice,長度為3。然后,我們使用range循環為每個內部切片創建了長度為2的子切片。接下來,我們給多維切片中的元素進行了賦值。最后,我們使用嵌套的range循環打印了多維切片的內容。

package mainimport "fmt"func main() {// 創建一個初始切片,長度為3slice := make([][]int, 3)for i := range slice {// 每個內部切片長度為2slice[i] = make([]int, 2)}// 給多維切片中的元素賦值slice[0][0] = 50slice[0][1] = 60slice[1][0] = 70slice[1][1] = 80slice[2][0] = 90slice[2][1] = 100// 打印多維切片的內容for i := range slice {for j := range slice[i] {fmt.Println(slice[i][j])}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】一文簡練總結【多態】及其底層原理&具體應用(21)

前言 大家好吖&#xff0c;歡迎來到 YY 滴C系列 &#xff0c;熱烈歡迎&#xff01; 本章主要內容面向接觸過C的老鐵 主要內容含&#xff1a; 歡迎訂閱 YY滴C專欄&#xff01;更多干貨持續更新&#xff01;以下是傳送門&#xff01; 目錄 一.多態的概念二.多態的實現1&#xff…

【C++】:拷貝構造函數與賦值運算符重載的實例應用之日期類的實現

C實現日期類 ├─屬性&#xff1a; │ ├─年份 │ ├─月份 │ └─日期 ├─方法&#xff1a; │ ├─構造函數 │ ├─拷貝構造函數 │ ├─析構函數 │ ├─設置年份 │ ├─設置月份 │ ├─設置日期 │ ├─獲取年份 │ ├─獲取月份 │ ├─獲取日期 │ ├…

websocket和mqtt

WebSocket是一種通信協議&#xff0c;它允許在瀏覽器和服務器之間建立持久連接&#xff0c;并允許雙向傳遞數據。MQTT則是一種輕量級的發布/訂閱消息傳輸協議&#xff0c;常用于物聯網(IoT)設備之間的通信。 &#xff08;1&#xff09;js能直接實現mqtt嗎&#xff0c;還是需…

已解決java.lang.IllegalStateException: Duplicate key

已解決java.lang.IllegalStateException: Duplicate key 文章目錄 報錯問題解決思路解決方法交流 報錯問題 java.lang.IllegalStateException: Duplicate key 解決思路 java.lang.IllegalStateException: Duplicate key 是由于在使用 Map 或 Set 時&#xff0c;試圖將一個已經…

十、sdl顯示yuv圖片

前言 SDL中內置加載BMP的API&#xff0c;使用起來會更加簡單&#xff0c;便于初學者學習使用SDL 如果需要加載JPG、PNG等其他格式的圖片&#xff0c;可以使用第三方庫&#xff1a;SDL_image 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12sdl2.0.22&…

redis的性能管理和雪崩

redis的性能管理 redis的數據是緩存在內存當中的 系統巡檢&#xff1a; 硬件巡檢、數據庫、nginx、redis、docker、k8s 運維人員必須要關注的redis指標 在日常巡檢中需要經常查看這些指標使用情況 info memory #查看redis使用內存的指標 used_memory:11285512 #數據占用的…

最簡單的簡歷練習

代碼&#xff1a; <!DOCTYPE html> <html> <head> <title>我的簡歷</title> <style> body { background-image: url(https://picsum.photos/id/1018/1000/1000); background-size: cover; …

已解決java.lang.RuntimeException: java.io.IOException: invalid constant type: 18異常的正確解決方法,親測有效!!!

已解決java.lang.RuntimeException: java.io.IOException: invalid constant type: 18異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 文章目錄 報錯問題解決方法交流 報錯問題 java.lang.RuntimeException: java.io.IOException: invalid cons…

完美解決ERROR: Command errored out with exit status 1: command: ‘f:\program files\python\python36\pyt

完美解決ERROR: Command errored out with exit status 1: command: f:\program files\python\python36\pyt 下滑查看解決方法 文章目錄 報錯問題解決思路解決方法交流 報錯問題 ERROR: Command errored out with exit status 1: command: ‘f:\program files\python\python3…

【華為OD】C卷真題 100%通過:攀登者1 C/C++源碼實現

【華為OD】C卷真題 100%通過&#xff1a;攀登者1 C/C源碼實現 目錄 題目描述&#xff1a; 示例1 代碼實現&#xff1a; 題目描述&#xff1a; 攀登者喜歡尋找各種地圖&#xff0c;并且嘗試攀登到最高的山峰。 地圖表示為一維數組&#xff0c;數組的索引代表水平位置&…

C++二分查找算法:有序矩陣中的第 k 個最小數組和

本文涉及的基礎知識點 二分查找算法合集 本題的簡化 C二分查找算法&#xff1a;查找和最小的 K 對數字 十分接近m恒等于2 題目 給你一個 m * n 的矩陣 mat&#xff0c;以及一個整數 k &#xff0c;矩陣中的每一行都以非遞減的順序排列。 你可以從每一行中選出 1 個元素形成…

哈希unordered_set,unordered_map的練習

349. 兩個數組的交集 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2]示例 2&#xff1a; 輸…

JSP過濾器和監聽器

什么是過濾器 Servlet過濾器與Servlet十分相似&#xff0c;但它具有攔截客戶端&#xff08;瀏覽器&#xff09;請求的功能&#xff0c;Servlet過濾器可以改變請求中的內容&#xff0c;來滿足實際開發中的需要。 對于程序開發人員而言&#xff0c;過濾器實質就是在Web應用服務器…

使用Wireshark提取流量中圖片方法

0.前言 記得一次CTF當中有一題是給了一個pcapng格式的流量包&#xff0c;flag好像在某個響應中的圖片里。比較簡單&#xff0c;后來也遇到過類似的情況&#xff0c;所以總結和記錄一下使用Wireshark提取圖片的方法。 提取的前提是HTTP協議&#xff0c;至于HTTPS的協議需要導入服…

【算法】摩爾投票算法

目錄 1.概述2.算法思想3.代碼實現3.1.t ?n / 2?3.2.t ?n / 3?3.3.t ?n / (m 1)? 4.應用 參考&#xff1a;LeetCode_多數元素 II 題解 1.概述 &#xff08;1&#xff09;摩爾投票法 (Boyer–Moore Majority Vote Algorithm) 是一種用來尋找一組元素中多數元素的常量級…

flutter,uni-app開發調試ios

一、申請ios開發者賬號 二、ios開發者配置 ios 開發者需要配置的地方 https://developer.apple.com/account/resources/certificates/list Certificates&#xff08;證書&#xff09;: 作用&#xff1a; 證書用于對應用程序和開發者進行身份驗證&#xff0c;確保安全性和可…

如何為您的企業選擇合適的多因素認證?

在傳統的網絡安全架構中&#xff0c;重點在于防止非法入侵&#xff0c;例如防火墻、VPN 、堡壘機等安全設備的重心都在于防止用戶違規訪問企業資源&#xff0c;一旦合法用戶的賬號密碼被入侵者拿到&#xff0c;就可以冒充合法用戶訪問企業資源&#xff0c;所有的安全設備形同虛…

springcloud超市管理系統源碼

技術說明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介紹&#xff1a; 后臺管理&#xff1a; 統計分析&#xff1a;查看用戶&#xff0c;商品&#xff0c;銷售數量&#xff1b;…

Mock 數據

1. Mock 數據的方式 2. json-server 實現 Mock 數據 項目中安裝json-server npm i -D json-server準備一個json文件添加啟動命令 //package.json"scripts": {"start": "craco start","build": "craco build","test&q…

簡單聊聊加密和加簽的關系與區別

大家好&#xff0c;我是G探險者。 平時我們在項目上一定都聽過加密和加簽&#xff0c;加密可能都好理解&#xff0c;知道它是保障的數據的機密性&#xff0c;那加簽是為了保障啥勒&#xff1f;它和加密有啥區別&#xff1f; 帶著這個疑問&#xff0c;我們就來聊聊二者的區別。…