go語言初識別(五)

本博客內容涉及到:切片

切片

1. 切片的概念

首先先對數組進行一下回顧:

  1. 數組定義完,長度是固定的,例如:
var num [5]int = [5]int{1,2,3,4,5}

定義的num數組長度是5,表示只能存儲5個整形數字,現在向數組num追加一個數字,代碼會出錯。
2. 使用數組作為函數參數進行傳遞時,如果實參為5個元素的整形數組,那么形參也必須為5個元素的整形數組,否則出錯。
而切片是一個可變長的序列(可以追加元素),可以包含任意類型的元素。切片比數組更靈活,更強大。

2. 切片和數組的區別

package mainimport "fmt"/*
演示切片和數組有什么區別
*/func main() {// 數組的基本定義a := [5]int{}fmt.Println(a)// 切片的基本定義s := []int{}fmt.Println(s)
}

輸出結果:
在這里插入圖片描述
在數組定義過程中,必須指定數組的長度,并且在未給數組賦值時,數組元素默認為0。在給切片定義過程中[]內無需賦值,且未進行賦值的切片為空。
下面使用append()函數給切片追加數據。
【注意】:
使用append()函數,當容量小于1024時是按照2倍容量擴容,當大于1024時不是按照兩倍容量進行擴容(每次約增加當前容量的1/4)。

	s = append(s, 1, 2, 3, 4, 5, 6)fmt.Println(s)

輸出結果:
在這里插入圖片描述
append()函數中,第一個參數表示向哪個切片追加數據,后面表示具體追加的數據。

3.切片的定義方式

下面演示了切片的三種定義方式:

package mainimport "fmt"/*
演示切片的定義方式
*/func main() {// 第一種s1 := []int{}fmt.Println(s1)// 第二種var s2 []int //只是缺少了長度fmt.Println(s2)// 第三種s3 := make([]int, 5, 10) // 其中5是長度,10 是容量fmt.Println(s3)
}

輸出結果:
在這里插入圖片描述
使用make()函數時,前面一個數字為函數切片的長度,后面的那個數字是切片的容量。
**長度:**已經初始化的空間,切片初始空間默認值都是0。
**容量:**已經開辟的空間,包括已經初始化的空間和空閑的空間。
【注意】:
使用make()函數時,切片的長度一定要小于容量。
切片賦值方式與數組相同。

4.切片截取

下面程序演示了切片的截取操作:

package mainimport "fmt"/*
演示切片的截取
*/
func main() {s := []int{1, 2, 3, 4, 5, 7, 8, 9, 10}// 從切片中截取數據slice := s[1:3:5]fmt.Println(slice)
}

輸出結果:
在這里插入圖片描述
解釋s[1:3:5]
可以使用s[low: high: max]來表示:

  1. low:表示下標的起點,從該位置開始截取。
  2. high:表示取到哪結束,也就是下標的終點(不包含該位置)。左閉右開區間。
  3. max:用來計算容量,使用max-low可以計算出容量為多少。

在這里插入圖片描述

5.修改截取切片的值

修改截取過后的新切片的值會影響到原來切片的值。

package mainimport "fmt"/*
演示修改截取的新切片的值,會影響到原切片的值
*/func main() {s := []int{1, 2, 3, 4, 5, 6, 7, 8, 10}fmt.Println(s)s1 := s[2:5]fmt.Println(s1)s1[0] = 100fmt.Println(s1)fmt.Println(s)
}

輸出如下:
在這里插入圖片描述
切片進行截取操作后,截取后的切片指向的是原有的切片,所以在修改新切片的值會影響到原切片。

6. copy函數的使用

針對切片的操作常用的方法除了append()方法外,還有copy方法。
基本語法:copy(切片1, 切片2)
將第二個切片中的元素,拷貝到第一個切片中。

package mainimport "fmt"/*
演示切片的拷貝
*/
func main() {s1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}s2 := []int{1, 1, 1, 1, 1, 1}copy(s1, s2)fmt.Println(s1)
}

輸出結果:
在這里插入圖片描述
copy()函數會使第二個切片中的值將第一個元素中的值覆蓋。

7.切片作為函數參數

同其它數據類型一樣,切片也可作為函數參數:

package mainimport "fmt"/*
演示切片作為函數參數
*/func InitData(num []int) {for i := 0; i < len(num); i++ {num[i] = i}
}func main() {// 創建一個切片s := make([]int, 10)// 使用函數初始化切片InitData(s)// 打印切片中的內容fmt.Println(s)
}

輸出結果如下:
在這里插入圖片描述
通過這個程序可以發現,定義了一個切片s,然后調用InitData()函數,將切片s作為實參傳遞到該函數中,并在函數中對形參num賦值,影響到了main()函數中的切片s.
接下來對比數組作為參數時,是否會影響到main()函數中的值:

package mainimport "fmt"/*
演示數組作為函數參數時,是否會影響到main()函數中的值
*/func InitData(num [10]int) {for i := 0; i < len(num); i++ {num[i] = i}
}func main() {// 創建一個數組var s [10]int// 使用函數初始化切片InitData(s)// 打印數組中的內容fmt.Println(s)
}

輸出結果如下:
在這里插入圖片描述
可以看到, 同樣的操作,但是InitData()函數并未將main()函數中的數組值改變。
值傳遞和引用

  1. 值傳遞:方法調用時,實參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參數的值。
  2. 引用傳遞:也稱為傳地址。函數調用時,實際參數的引用(地址,而不是參數的值)被傳遞給函數中相對應的形式參數(實參與形參指向了同一塊存儲區域)。在函數執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數數值的改變將會影響時間參數的值。

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

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

相關文章

檢索模型預訓練方法:RetroMAE

論文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 論文鏈接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一種新的MAE工作流&#xff0c;編碼器和解器輸入進行了不同的掩…

華為OD機試【計算最接近的數】(java)(100分)

1、題目描述 給定一個數組X和正整數K&#xff0c;請找出使表達式X[i] - X[i1] … - X[i K 1]&#xff0c;結果最接近于數組中位數的下標i&#xff0c;如果有多個i滿足條件&#xff0c;請返回最大的i。 其中&#xff0c;數組中位數&#xff1a;長度為N的數組&#xff0c;按照元…

軟件性能測試有哪些測試類型和方法?

軟件性能測試是一種通過模擬真實用戶使用情況&#xff0c;評估軟件系統在各種壓力和負載下的表現的測試方法。在今天這個講究效率的時代&#xff0c;軟件性能測試是不可或缺的一環。它能幫助開發人員和企業發現潛在的性能問題&#xff0c;提前優化改進&#xff0c;保證軟件系統…

Flutter 中的 SizeChangedLayoutNotifier 小部件:全面指南

Flutter 中的 SizeChangedLayoutNotifier 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;SizeChangedLayoutNotifier 是一種特殊的小部件&#xff0c;它用于監聽其子組件尺寸的變化。當子組件的大小發生變化時&#xff0c;SizeChangedLayoutNotifier 可以通知其他組件…

動態內存管理—C語言通訊錄

目錄 一&#xff0c;動態內存函數的介紹 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的內存開辟 二&#xff0c;通訊錄管理系統 動態內存函數的介紹 malloc free calloc realloc 一&#xff0c;動態內存函數的介紹 1.1 malloc和free void* malloc (…

回文鏈表(快慢指針解法之在推進過程中反轉)

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd;抱怨深處黑暗&#xff0c;不如提燈前行…

進程間通信IPC機制

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。IPC機制有多種方式&#xff0c;每種方式都有其特定的工作原理、應用場景以及優缺點。以下是對幾種主要IPC方式的詳細解釋&#xff1a; 管道&#xff08;Pipe&a…

數據結構算法題day04

數據結構算法題day04 題目分析算法思想代碼完整運行代碼如下&#xff1a; 題目 對長度為n的順序表L&#xff0c;編寫一個時間復雜度為O(n)、空間復雜度為O(1)的算法 該算法刪除線性表中所有值為X的數據元素。分析 O(n) -> 掃描一次順序表 O(1) -> 申請常數個輔助空間 1…

代碼隨想錄算法訓練營day14|二叉樹的遞歸遍歷、二叉樹的迭代遍歷、二叉樹的統一迭代法

二叉樹的遞歸遍歷 首先需要明確的一點是&#xff0c;前序中序和后序在二叉樹的遞歸遍歷中的區別僅在于遞歸函數中操作的順序&#xff0c;前序是在遍歷一個節點的左右子樹前進行操作&#xff0c;中序是在遍歷一個節點的左子樹后進行操作再遍歷右子樹&#xff0c;而后序是在遍歷…

C++算術運算和自增自減運算

一 引言 表示運算的符號稱為運算符。 算術運算&#xff1b; 比較運算&#xff1b; 邏輯運算&#xff1b; 位運算&#xff1b; 1 算術運算 算術運算包括加、減、乘、除、乘方、指數、對數、三角函數、求余函數&#xff0c;這些都是算術運算。 C中用、-、*、/、%分別表示加、減…

【AI】AI框架項目OpenWebUI如何追加模型

【背景】 openWebUI是一個非常好用的AI框架項目&#xff0c;既可以用API形式連接各類外部AI模型&#xff0c;也可以直接連接服務器硬盤上部署的離線大模型。 簡單來說&#xff0c;OpenWebUI可以用來方便地把你的本地模型變為可供所有內網人員使用的SAAS服務站點&#xff0c;并…

《當微服務遇上Ribbon:一場負載均衡的華麗舞會》

在微服務的廚房里&#xff0c;如何確保每一道服務都恰到好處&#xff1f;揭秘Spring Cloud Ribbon如何像大廚一樣精心調配資源&#xff0c;讓負載均衡變得像烹飪藝術一樣簡單&#xff01; 文章目錄 Spring Cloud Ribbon 詳解1. 引言微服務架構中的負載均衡需求Spring Cloud Rib…

【算法實戰】每日一題:設計一個算法,用最少數量的矩形覆蓋一系列寬度為d、高度為w的矩形,且使用矩形不能超出邊界

題目 設計一個算法&#xff0c;用最少數量的矩形覆蓋一系列寬度為d、高度為w的矩形建筑物側墻&#xff0c;且矩形不能超出邊界。 核心思路 考慮這種結構 前面遞增后面一個與前面的某個高度一致&#xff0c;這時候考慮最下面的覆蓋&#xff08;即都是從最下面向上覆蓋&#…

redis數據類型set,zset

華子目錄 Set結構圖相關命令sdiff key1 [key2]sdiffstore destination key1 [key2...]sinter key1 [key2...]sinterstore destination key1 [key2...]sunion key1 [key2...]sunionstore destination key1 [key2...]smove source destination memberspop key [count]sscan key c…

Java GC問題排查的一些個人總結和問題復盤

個人博客 Java GC問題排查的一些個人總結和問題復盤 | iwts’s blog 是否存在GC問題判斷指標 有的比較明顯&#xff0c;比如發布上線后內存直接就起飛了&#xff0c;這種也是比較好排查的&#xff0c;也是最多的。如果單純從優化角度&#xff0c;看當前應用是否需要優化&…

探索旅行的優惠之選,千益暢行旅游卡讓旅程更省心省力!

在旅行的道路上&#xff0c;一張旅游卡往往能為您帶來意想不到的便利與優惠。那么&#xff0c;對于千益暢行旅游卡&#xff0c;您是否好奇如何輕松擁有它呢&#xff1f; 首先&#xff0c;千益暢行旅游卡作為旅行者的貼心伴侶&#xff0c;為您提供了多樣化的獲取渠道。您可以通…

Unity實現首行縮進兩個字符

效果 在Unity中如果想實現首行縮進兩個字符&#xff0c;你會發現按空格是沒法實現的。 實現原理&#xff1a;用空白的透明的字替代原來的位置。 代碼&#xff1a; <color#FFFFFF00>XXX</color> 趕緊去試試吧&#xff01;

備戰秋招—模擬版圖面試題來了

隨著暑期的腳步逐漸臨近&#xff0c;電子工程和集成電路設計領域的畢業生們&#xff0c;也將迎來了另一個求職的黃金期——秋招。我們總說機會是留給有準備的人。對于有志于投身于模擬版圖設計的學子們來說&#xff0c;為了在眾多求職者中脫穎而出&#xff0c;充分備戰模擬版圖…

C# 工商銀行缺少infosecapiLib.infosec

搜索Tlbimp.exe 這里使用4.8.1下的處理&#xff0c;以管理員身份打開powershell cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools".\TlbImp.exe "G:\CSharp\icbc-api-sdk-cop-c#\sdk-cop\sdk-cop\dll\infosecapi.dll" …

PCIe協議之-DLLP詳解

?前言&#xff1a; &#x1f31f;數據鏈路層的功能 數據鏈路層將從物理層中獲得報文&#xff0c; 并將其傳遞給事務層&#xff1b; 同時接收事務層的報文&#xff0c; 并將其轉發到物理層; 核心的功能有以下三點 1.保證TLP在 PCIe 鏈路中的正確傳遞; 2.數據鏈路層使用了容錯…