Go語言--語法基礎6--基本數據類型--切片類型

Go 語言切片是對數組的抽象。Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go 中提供了一種靈活、功能強悍的內置類型切片 ("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。

?

切片是一個在 Go 語言中引入的新理念,它有一些特征如下:

?

  • 對數組抽象
  • 數組長度不固定
  • 可追加元素
  • 切片容量可增大

1、定義切片

你可以聲明一個未指定大小的數組來定義切片:

?

var identifier []type 

?

切片不需要說明長度。

?

示例

?

var s []int // 定義一個整形大小不定的切片,變量名稱 s

?

除此之外,切片還有其他幾種定義方式:

?

var (a []int // nil 切片,和 nil 相等,一般用來表示一個不存在的切片b = []int{} // 空切片,和 nil 不相等,一般用來表示一個空的集合c = []int{1, 2, 3} // 有3個元素的切片,len=3,cap=3d = c[:2] // 有2個元素的切片,len=2,cap=3e = c[0:2:cap(c)] // 有2個元素的切片,len=2,cap=3 f = c[:0] // 有0個元素的切片,len=0,cap=3g = make([]int, 3) // 有3個元素的切片,len=3,cap=3 h = make([]int, 2, 3) // 有2個元素的切片,len=2,cap=3 i = make([]int, 0, 3) // 有0個元素的切片,len=0,cap=3 
)

?

本質
切片本身是一個三個字段的數據結構:

?

type SliceHeader struct {Data uintptr // 指向底層數組的指針Len  int     // 切片中元素的個數,通過 len(s) 獲取Cap  int     // 切片的容量(不需重新分配內存前,可容納的元素數量),通過 cap(s) 獲取
}

?

區分數組的聲明和切片的聲明方式
當使用字面量來聲明切片時,其語法與使用字面量聲明數組非常相似。二者的區別是:如果在?[]?運算符里指定了一個值,那么創建的就是數組而不是切片。只有在?[]?中不指定值的時候,創建的才是切片。

2、切片初始化

s := []int{1, 2, 3}  // 直接初始化切片,[] 表示是切片類型,{1, 2, 3} 初始化值依次是1, 2, 3,其 cap=len=3
s := arr[:]          // 初始化切片 s,是數組 arr 的引用
s := arr[startIndex:endIndex]  // 將 arr 中從下標 startIndex 到 endIndex-1 下的元素創建為一個新的切片
s := arr[startIndex:]  // 缺省 endIndex 時將表示一直到 arr 的最后一個元素
s := arr[:endIndex]    // 缺省 startIndex 時將表示從 arr 的第一個元素開始
s1 := s[startIndex:endIndex]  // 通過切片 s 初始化切片 s1
s := make([]int, len, cap)  // 通過內置函數 make() 初始化切片 s,[]int 標識為其元素類型為 int 的切片

3、訪問

切片只能訪問其長度范圍內的內容,通過下標訪問:

?

s[i] = 10  // 寫操作
v := s[i]  // 讀操作

?

迭代方式訪問
切片是一個集合,可以通過?range?迭代其中的元素:

?

  1. for 循環方式的迭代

?

var slice = []string{"Red", "Yellow", "Blue", "Green", "Gray"}
// for 循環迭代
for i := 0; i < len(slice); i++ {fmt.Println(i, slice[i])
}

?

  1. range 遍歷

?

for index, value := range slice {fmt.Printf("index: %d, value: %s\n", index, value)
}

?

注意

?

  • range?返回的第二個值是對應元素的一份副本,不能用于修改;若要修改則需要通過索引。
  • 迭代方式遍歷時,不能對切片進行操作(添加、或刪除元素),否則會引發異常。

5、len () 和 cap () 函數

切片是可索引的,并且可以由?len()?方法獲取長度。切片提供了計算容量的方法?cap()?可以測量切片最長可以達到多少。

?

示例

?

package main
import "fmt"func main() {var numbers = make([]int, 3, 5)printSlice(numbers)
}func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

?

輸出結果

?

len=3 cap=5 slice=[0 0 0]

6、空 (nil) 切片

一個切片在未初始化之前默認為?nil,長度為 0。

?

示例

?

package main
import "fmt"func main() {var numbers []intprintSlice(numbers)if numbers == nil {fmt.Printf("切片是空的")}
}func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

?

輸出結果

len=0 cap=0 slice=[]
切片是空的

7、切片的增刪改查操作

1. 切片尾部新增元素

var slice []int
// 新增一個元素
slice = append(slice, 1)
// 新增多個元素
slice = append(slice, 1, 2)
// 新增多個元素,切片作為參數,需要使用 ... 運算符來輔助解構切片
var newSlice = []int{1, 2, 3}
slice = append(slice, newSlice...) // ... 不能省略

2. 切片首部新增元素

// 切片首部增加元素
var slice = []int{1, 2}
// 首部增一個元素
slice = append([]int{5}, slice...) 
// 首部增多個元素
var newSlice = []int{5, 6, 7}
slice = append(newSlice, slice...) 

3. 切片中間新增元素

// 切片中間某個位置插入元素
var slice = []int{1, 2, 3}
// 比如需要插入到元素索引 i 后,則先以 i+1 為切割點,把 slice 切割成兩半
// 索引 i 前數據:slice[:i+1],索引 i 后的數據:slice[i+1:]
// 然后再把索引 i 后的數據:slice[i:] 合并到需要插入的元素切片中
// 最后再把合并后的切片合并到索引 i 前數據:slice[:i]
// 如在元素索引 1 后增加元素
slice = append(slice[:2], append([]int{6, 7}, slice[2:]...)...)

刪除操作

var slice = []int{1, 2, 3, 4, 5, 6}
// 從切片首部刪除
slice = slice[1:]
// 從切片尾部刪除2個
slice = slice[:len(slice) - 2]
// 從切片中間刪除,如從索引為 i,刪除2個元素(i+2)
slice = append(slice[:1], slice[3:]...)

其他操作

// 修改元素
var slice = []int{1, 2, 3}
slice[1] = 6// 查找元素
var slice = []int{1, 2, 3}
log.Println("slice[1]=", slice[1])// 試圖訪問超出其長度的元素就會報錯
a := slice[4]  // runtime error: index out of range [4] with length 3
log.Println(a)

課堂練習

使用切片的增刪改查功能完成一個簡單用戶信息錄入和維護程序。

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

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

相關文章

?御控物聯網綜合應用實訓平臺-物聯網系統和實驗室實訓系統?

在科技飛速發展的今天&#xff0c;物聯網技術已滲透到各個領域&#xff0c;成為推動產業升級和創新發展的重要力量。對于職業教育和科研機構而言&#xff0c;搭建一套完善的物聯網綜合應用實訓系統&#xff0c;培養適應時代需求的物聯網專業人才&#xff0c;顯得尤為迫切。而御…

ElasticSearch中的分片是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【ElasticSearch中的分片是什么?】面試題。希望對大家有幫助&#xff1b; ElasticSearch中的分片是什么? 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在 Elasticsearch 中&#xff0c;分片&#xff08;Shard&#x…

基于PHP+MySQL組合開發開源問答網站平臺源碼系統 源碼開源可二次開發 含完整的搭建指南

問答網站成為人們獲取知識、交流經驗的重要平臺。無論是專業領域的疑難解答&#xff0c;還是生活常識的分享探討&#xff0c;問答網站都發揮著巨大的作用。對于想要搭建問答網站的個人或企業來說&#xff0c;一款優秀的開源問答網站平臺源碼系統至關重要。今天&#xff0c;我們…

Python工程師面試題集

文章目錄一、Python基礎二、關鍵Python庫三、Web開發四、并發與性能五、系統設計答案區一、Python基礎Python的可變與不可變數據類型有哪些&#xff1f;底層實現原理&#xff1f;Python2與Python3的主要區別解釋GIL全局解釋器鎖及其對多線程的影響裝飾器Decorator的作用與實現原…

什么是碼率?剪映中如何選擇適合的視頻碼率

在視頻編輯過程中&#xff0c;碼率&#xff08;Bitrate&#xff09;是一個決定視頻畫質的關鍵參數。對于普通用戶來說&#xff0c;剪映作為一款功能強大的視頻編輯工具&#xff0c;其默認的碼率設置直接影響最終導出視頻的質量和文件大小。那么&#xff0c;剪映的默認碼率是多少…

專題:2025電商營銷與AI應用發展趨勢報告|附260+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42834 電商行業在數字經濟浪潮中持續演進&#xff0c;2025年呈現出多平臺發力、技術驅動增長、消費需求多元等特點。快手和抖音作為國內直播電商的重要陣地&#xff0c;各品類銷售表現各有亮點&#xff0c;同時全球電商市場規模穩步…

windows安裝stable diffusion

安裝git https://git-scm.com/downloads/winclone項目 創建一個文件夾&#xff0c;clone下來stable diffusion webui git網址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git安裝…

Python爬蟲 XPath 三方庫lxml

前言 XPath是Python爬蟲最重要的過濾原始數據的手段之一,是爬蟲最核心的技術 是專業抓取HTML頁面而生的,基本上只用于抓取HTML頁面使用 目錄 安裝支持XPath三方庫lxml XPath代碼入門示例 XPath表達式語法 在源代碼上面直接獲取XPath 安裝支持XPath三方庫lxml pip instal…

深度學習洪水推演:Python融合多源衛星數據可視化南方暴雨災情

目錄1. 引言&#xff1a;多源衛星融合分析的突破性價值2. 多模態融合架構設計3. 雙流程對比分析3.1 單源 vs 多源融合分析3.2 洪水推演核心流程4. 核心代碼實現4.1 多源數據融合處理&#xff08;Python&#xff09;4.2 時空洪水推演模型&#xff08;PyTorch&#xff09;4.3 三維…

「日拱一碼」016 深度學習常用庫——PyTorch

目錄 張量操作 創建張量&#xff1a; torch.tensor() &#xff1a;直接從數據創建張量 torch.zeros() &#xff1a;創建全零張量 torch.ones() &#xff1a;創建全一張量 torch.randn() &#xff1a;創建正態分布隨機張量 torch.arange() &#xff1a;創建等差序列張量 …

【Qt】QStringLiteral 介紹

QStringLiteral 介紹 QStringLiteral 是 Qt 框架中提供的一個宏&#xff0c;用于在編譯時從字符串字面量創建 QString 對象&#xff0c;具有高效和零內存分配的特點。 主要特點 編譯時轉換&#xff1a;將字符串字面量在編譯時轉換為 QString 數據&#xff0c;而不是運行時。…

UI前端與數字孿生結合實踐探索:智慧物流的貨物追蹤與配送優化

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構智慧物流的技術范式在物流行業數字化轉型的浪潮中&#xff0…

Java創建型模式---工廠模式

工廠模式基礎概念 工廠模式是一種創建型設計模式&#xff0c;其核心思想是將對象的創建和使用分離。通過使用工廠模式&#xff0c;可以將對象創建邏輯集中管理&#xff0c;提高代碼的可維護性和可擴展性。在 Java 中&#xff0c;工廠模式主要分為三種類型&#xff1a; 簡單工…

分布式定時任務:xxl-job

基礎 XXL - Job采用的是調度中心&#xff08;Scheduler&#xff09;與執行器&#xff08;Executor&#xff09;分離的架構設計&#xff0c;這種設計帶來了諸多優勢&#xff0c;比如高可用性、可擴展性以及便于分布式部署等。 1. 調度中心&#xff08;XXL - Job Admin&#xf…

易語言實現釘釘PC端高頻率鏈接批量打開系統

易語言實現釘釘PC端高頻率鏈接批量打開系統 一、需求分析與技術方案 核心需求: 在釘釘PC端私聊消息中嵌入特殊格式鏈接用戶點擊后通過自定義協議喚醒本地程序支持每分鐘處理10萬次請求的批量操作實現鏈接的批量生成和管理技術方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…

MyBatis如何實現動態數據源切換?

大家好&#xff0c;我是鋒哥。今天分享關于【MyBatis如何實現動態數據源切換&#xff1f;】面試題。希望對大家有幫助&#xff1b; MyBatis如何實現動態數據源切換&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在MyBatis中實現動態數據源切換&#…

實踐篇:14-構建 Node.js 應用程序鏡像

背景介紹 Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行時環境&#xff0c;以其事件驅動、非阻塞 I/O 模型而聞名&#xff0c;廣泛用于構建后端服務和前端應用。 Node.js 的特點使其非常適合容器化部署&#xff1a; 輕量級運行時&#xff1a;相比傳統后端語言&#xf…

Spring Cloud 微服務(鏈路追蹤與日志聚合)

&#x1f4cc; 摘要 在微服務架構中&#xff0c;隨著服務數量的增加和調用關系的復雜化&#xff0c;傳統的日志記錄方式已經無法滿足對系統運行狀態的全面掌控。如何快速定位異常請求、分析服務調用耗時、追蹤完整鏈路成為運維和開發人員面臨的核心挑戰。 為此&#xff0c;Sp…

PADS交互式布局

PADS的交互式布局通過原理圖與PCB的雙向聯動大幅提升設計效率。在原理圖中框選電路模塊時&#xff0c;PCB視圖將自動高亮對應元件組并生成可移動簇&#xff0c;拖動時保持模塊內部相對位置不變。布局過程中啟用實時推擠功能&#xff08;Placement Shoving&#xff09;&#xff…

類圖+案例+代碼詳解:軟件設計模式----原型模式

5、原型模式 通過復制現有對象來創建新對象&#xff0c;避免從零開始構建&#xff0c;就像 “復印文件” 一樣。 克隆的核心是復用現有對象狀態 用 克隆熊貓 舉例&#xff0c;秒懂原理 假設你有一只熊貓對象&#xff08;屬性&#xff1a;名字、年齡、毛色&#xff09;&#…