【Go語言基礎【17】】切片:一種動態數組

文章目錄

  • 零、概述
  • 一、切片基礎
    • 1、切片的結構
    • 2、切片的創建方式
    • 3、切片的操作與擴容
  • 二、切片的拷貝與共享內存
  • 三、切片作為函數參數

Go語言的切片(slice)是一種動態數組,提供了靈活、高效的元素序列操作。它基于底層數組實現,通過長度和容量的分離設計,支持動態擴容和內存優化。

零、概述

切片 vs 數組

特性切片(slice)數組(array)
類型引用類型值類型
長度動態可變固定不可變
傳遞方式傳遞指針副本,修改影響原數據傳遞值拷貝,修改不影響原數據
創建方式make([]T, len, cap)[]T{...}[n]T{...}[...]T{...}
內存占用包含指針、長度、容量僅包含元素

性能優化原理:

  1. 預分配容量:若已知元素數量,使用make([]T, 0, capacity)避免頻繁擴容。
  2. 避免內存泄漏:切片保留對底層數組的引用,若僅需部分元素,建議copy到新切片后釋放原數組。
  3. 大容量切片謹慎擴容:大切片擴容可能導致內存浪費,可通過copy手動控制擴容策略。

?

一、切片基礎

1、切片的結構

切片是一個引用類型,底層結構包含三個字段:

type slice struct {array unsafe.Pointer // 指向底層數組的指針len   int            // 當前切片的長度cap   int            // 底層數組的容量
}
  • 長度(len):切片中實際存在的元素數量,可通過len()函數獲取。
  • 容量(cap):底層數組的總長度,可通過cap()函數獲取。
  • 指針(array):指向底層數組的起始位置,決定了切片的起始元素。

在這里插入圖片描述

示例:創建切片

s := make([]int, 3, 5) // 創建長度為3、容量為5的切片
// 底層數組: [0, 0, 0, 0, 0]
// 切片結構: {array: 指向數組, len: 3, cap: 5}

?

2、切片的創建方式

a. 使用make函數

s1 := make([]int, 3)      // 長度=容量=3,初始值為0
s2 := make([]int, 3, 5)   // 長度=3,容量=5

b. 使用切片字面量

s3 := []int{1, 2, 3}      // 長度=容量=3,初始值為[1,2,3]
s4 := []int{3: 100}       // 索引3的值為100,長度=容量=4,初始值為[0,0,0,100]

c. 從數組或切片派生

arr := [5]int{1, 2, 3, 4, 5}
s5 := arr[1:3]            // 從數組創建切片,[2,3],長度=2,容量=4
s6 := s5[0:2]             // 從切片創建切片,[2,3],長度=2,容量=4

?

3、切片的操作與擴容

a. 訪問元素
通過索引訪問,范圍為0len(s)-1

s := []int{1, 2, 3}
fmt.Println(s[0]) // 輸出: 1

?

b. 基于切片創建切片
通過指定[low:high:max]創建新切片:

  • low:起始索引(包含)。
  • high:結束索引(不包含),新切片長度為high - low
  • max:容量上限,新切片容量為max - low(可選,默認等于原切片容量)。
s := []int{10, 20, 30, 40, 50}
s1 := s[1:3]      // 長度=2,容量=4,元素=[20,30]
s2 := s[1:3:3]    // 長度=2,容量=2,元素=[20,30]

?

c. nil切片與空切片

var nilSlice []int         // nil切片,array=nil,len=0,cap=0
emptySlice := make([]int, 0) // 空切片,array指向空數組,len=0,cap=0
  • nil切片:未初始化,arraynil
  • 空切片:已初始化,但長度為0,array指向底層數組。

?

d. 動態擴容:append函數

s := make([]int, 0, 2)     // 容量=2
s = append(s, 1, 2)        // 追加元素,容量足夠,直接添加
s = append(s, 3)           // 容量不足,觸發擴容(通常翻倍)

擴容規則

  • 容量<1000時,通常翻倍。
  • 容量≥1000時,按1.25倍增長(具體實現可能隨版本變化)。

?

e、多維切片
切片的元素可以是另一個切片,形成多維結構:

matrix := [][]int{{1, 2, 3},{4, 5, 6},
}fmt.Println(matrix[0][1]) // 輸出: 2

注意:多維切片的每個內層切片是獨立的,可擁有不同長度。
?

二、切片的拷貝與共享內存

  1. 淺拷貝(共享底層數組)
s1 := []int{1, 2, 3}
s2 := s1[0:2]             // s2與s1共享底層數組
s1[0] = 100               // 修改s1會影響s2
fmt.Println(s2[0])        // 輸出: 100
  1. 深拷貝(獨立內存)
    使用copy函數:
s1 := []int{1, 2, 3}
s2 := make([]int, len(s1))
copy(s2, s1)              // 復制元素到新切片
s1[0] = 100               // 修改s1不影響s2
fmt.Println(s2[0])        // 輸出: 1

?

三、切片作為函數參數

切片作為參數傳遞時,傳遞的是切片的值拷貝(即arraylencap的副本),但由于array是指針,函數內可修改原切片的元素:

func modify(s []int) {s[0] = 100           // 修改底層數組的元素
}func main() {s := []int{1, 2, 3}modify(s)fmt.Println(s[0])    // 輸出: 100
}

若需在函數內擴容并影響原切片,需返回新切片:

func appendElement(s []int) []int {return append(s, 4)
}s := []int{1, 2, 3}
s = appendElement(s)     // 需接收返回值以更新原切片

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

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

相關文章

MybatisPlus使用DB靜態工具出現找不到實體類的報錯

報錯&#xff1a;Not Found TableInfoCache. 原因在于沒有創建實體類對應的mapper&#xff0c;并且該mapper還必須繼承baseMapper。 猜測大概的原理應該是DB會去查找實體類對應的mapper&#xff0c;然后通過mapper去查找對應的實體類。

Linux nano命令的基本使用

參考資料 GNU nanoを使いこなすnano基礎 目錄 一. 簡介二. 文件打開2.1 普通方式打開文件2.2 只讀方式打開文件 三. 文件查看3.1 打開文件時&#xff0c;顯示行號3.2 翻頁查看 四. 文件編輯4.1 Ctrl K 復制 和 Ctrl U 粘貼4.2 Alt/Esc U 撤回 五. 文件保存與退出5.1 Ctrl …

LLMs 系列科普文(15)

前面 14 篇文章&#xff0c;就是本系列科普文中想介紹的大部分技術內容。重點講述了訓練這些模型的三個主要階段和范式&#xff1a;預訓練、監督微調和強化學習。 我向你們展示了這些步驟大致對應于我們已用于教導兒童的過程。具體來說&#xff0c;我們將預訓練比作通過閱讀說…

深入理解匯編語言中的順序與分支結構

本文將結合Visual Studio環境配置、順序結構編程和分支結構實現&#xff0c;全面解析匯編語言中的核心編程概念。通過實際案例演示無符號/有符號數處理、分段函數實現和邏輯表達式短路計算等關鍵技術。 一、匯編環境配置回顧&#xff08;Win32MASM&#xff09; 在Visual Studi…

Selenium4+Python的web自動化測試框架

一、什么是Selenium&#xff1f; Selenium是一個基于瀏覽器的自動化測試工具&#xff0c;它提供了一種跨平臺、跨瀏覽器的端到端的web自動化解決方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

React 樣式方案與狀態方案初探

React 本身只提供了基礎 UI 層開發范式&#xff0c;其他特性的支持需要借助相關社區方案實現。本文將介紹 React 應用體系中樣式方案與狀態方案的主流選擇&#xff0c;幫助開發者根據項目需求做出合適的選擇。 1. React 樣式方案 1.1. 內聯樣式 (Inline Styles) 通過 style …

PHP中如何定義常量以及常量和變量的主要區別

在PHP編程中&#xff0c;常量和變量是存儲數據的兩種重要方式。常量在定義后值不能改變&#xff0c;而變量的值可以在程序執行過程中發生變化。本文將詳細介紹如何在PHP中定義常量&#xff0c;并深入探討常量和變量的主要區別。 一、PHP中定義常量 1. 使用 define 函數定義常…

奈飛工廠官網,國內Netflix影視在線看|中文網頁電腦版入口

奈飛工廠是一個專注于提供免費Netflix影視資源的在線播放平臺&#xff0c;致力于為國內用戶提供的Netflix熱門影視內容。該平臺的資源與Netflix官網基本同步&#xff0c;涵蓋電影、電視劇、動漫和綜藝等多個領域。奈飛工廠的界面簡潔流暢&#xff0c;資源分類清晰&#xff0c;方…

CMS內容管理系統的設計與實現:架構設計

一、整體架構方案 &#xff08;一&#xff09;架構方案選擇&#xff08;根據項目規模&#xff09; 1. 中小型項目推薦方案&#xff08;團隊<10人&#xff09; #mermaid-svg-cjzaHpptY8pYWnzo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:1…

嵌入式里的時間魔法:RTC 與 BKP 深度拆解

文章目錄 RTC實時時鐘與BKPUnix時間戳UTC/GMT時間戳轉換時間戳轉換BKP簡介BKP基本結構1. 電池供電模塊&#xff08;VBAT 輸入&#xff09;2. 侵入檢測模塊&#xff08;TAMPER 輸入&#xff09;3. 時鐘輸出模塊&#xff08;RTC 輸出&#xff09;4. 內部寄存器組 RTC簡介RTC時鐘源…

STC8H系列 驅動步進電機

STC8H 驅動步進電機 一、引言二、硬件設計三、軟件設計Step_Motor2.c文件Step_ Motor2.h文件 一、引言 眾所周知STC8H系列有兩個PWM&#xff0c;分別為PWMA和PWMB外設模塊&#xff0c;我全都用上&#xff0c;豈不是就有兩個帶動電機的脈沖信號&#xff1f;&#xff01;哈哈哈哈…

Python高階函數:從入門到精通

目錄 Python高階函數詳解&#xff1a;從概念到高級應用引言&#xff1a;函數式編程的魅力一、高階函數基礎概念1.1 什么是高階函數1.2 Python中的一等函數 二、內置高階函數詳解2.1 map函數&#xff1a;數據轉換利器2.2 filter函數&#xff1a;數據篩選專家2.3 reduce函數&…

騰訊開源視頻生成工具 HunyuanVideo-Avatar,上傳一張圖+一段音頻,就能讓圖中的人物、動物甚至虛擬角色“活”過來,開口說話、唱歌、演相聲!

騰訊混元團隊提出的 HunyuanVideo-Avatar 是一個基于多模態擴散變換器&#xff08;MM-DiT&#xff09;的模型&#xff0c;能夠生成動態、情緒可控和多角色對話視頻。支持僅 10GB VRAM 的單 GPU運行&#xff0c;支持多種下游任務和應用。例如生成會說話的虛擬形象視頻&#xff0…

DeepSeek-R1-0528:開源推理模型的革新與突破

一、 發布日期與背景 2025年5月29日&#xff0c;備受業界關注的DeepSeek推理模型DeepSeek-R1迎來重要更新——DeepSeek-R1-0528模型正式發布。此次更新采取了“靜默發布”策略&#xff0c;未提前預告&#xff0c;而是通過官方渠道&#xff08;官網、App、小程序&#xff09;及…

LeetCode 1723: 完成所有工作的最短時間

給你一個整數數組 jobs &#xff0c;其中 jobs[i] 是完成第 i 項工作要花費的時間。 請你將這些工作分配給 k 位工人。所有工作都應該分配給工人&#xff0c;且每項工作只能分配給一位工人。工人的 工作時間 是完成分配給他們的所有工作花費時間的總和。請你設計一套最佳的工作…

JDK8新特性之Steam流

這里寫目錄標題 一、Stream流概述1.1、傳統寫法1.2、Stream寫法1.3、Stream流操作分類 二、Stream流獲取方式2.1、根據Collection獲取2.2、通過Stream的of方法 三、Stream常用方法介紹3.1、forEach3.2、count3.3、filter3.4、limit3.5、skip3.6、map3.7、sorted3.8、distinct3.…

split方法

在編程中&#xff0c;split 方法通常用于將字符串按照指定的分隔符拆分成多個部分&#xff0c;并返回一個包含拆分結果的列表&#xff08;或數組&#xff09;。不同編程語言中的 split 方法語法略有不同&#xff0c;但核心功能相似。以下是常見語言中的用法&#xff1a; ?1. P…

深入理解 x86 匯編中的符號擴展指令:從 CBW 到 CDQ 的全解析

引入 在匯編語言的世界里&#xff0c;數據寬度的轉換是一項基礎卻至關重要的操作。尤其是在處理有符號數時&#xff0c;符號擴展&#xff08;Sign Extension&#xff09;作為保持數值符號一致性的核心技術&#xff0c;直接影響著運算結果的正確性。本文將聚焦 x86 架構中最常用…

計算機基礎知識(第五篇)

計算機基礎知識&#xff08;第五篇&#xff09; 架構演化與維護 軟件架構的演化和定義 軟件架構的演化和維護就是對架構進行修改和完善的過程&#xff0c;目的就是為了使軟件能夠適應環境的變化而進行的糾錯性修改和完善性修改等&#xff0c;是一個不斷迭代的過程&#xff0…

前端開發三劍客:HTML5+CSS3+ES6

在前端開發領域&#xff0c;HTML、CSS和JavaScript構成了構建網頁與Web應用的核心基礎。隨著技術標準的不斷演進&#xff0c;HTML5、CSS3以及ES6&#xff08;ECMAScript 2015及后續版本&#xff09;帶來了諸多新特性與語法優化&#xff0c;極大地提升了開發效率和用戶體驗。本文…