go切片定義和初始化

1.簡介

切片是數組的一個引用,因此切片是引用類型,在進行傳遞時,遵守引用傳遞的機制。切片的使用和數組類似,遍歷切片、訪問切片的元素和切片的長度都一樣。。切片的長度是可以變化的,因此切片是一個可以動態變化的數組。

2.切片的定義基本語法

var 切片名 []類型

比如:var a []int

3.切片的初始化

3.1方式一

第一種方式:定義一個切片,然后讓切片去引用一個已經創建好的數組。

    var arr = [...]int{1, 2, 3, 4, 5, 6}slice := arr[1:3]slice[0] = 100fmt.Println("arr:", arr)fmt.Println("slice:", slice)fmt.Println("slice長度:", len(slice))fmt.Println("slice容量:", cap(slice))

結果:

arr: [1 100 3 4 5 6]
slice: [100 3]
slice長度: 2
slice容量: 5

根據上面結果分析:切片的確是一個引用類型,改變slice的值會影響原數組。

其實切片底層其實就是一個數據結構

type slice struct{

ptr *[2]int

len int

cap int? }

3.2方式二

第二種方式:通過make來創建切片。

基本語法:var 切片名 []type=make([]type ,len,cap)

參數說明:type:就是數據類型 len:大小 cap:值切片的容量,可選,如果你分配了cap,則要求cap>=len。

    var SliceA = make([]int, 5, 6)SliceA[0] = 1fmt.Println(SliceA) //[0 0 0 0 0]fmt.Printf("長度:%d-容量%d", len(SliceA), cap(SliceA))

結果:

[1 0 0 0 0]
長度:5-容量6

對上面代碼小結:

1.通過make方式創建切片可以指定切片的大小和容量。

2.如果沒給切片的各個元素賦值,那么就會使用使用默認值 int 0 float 0? string “” bool false。

3.通過make方式船艦的切片對應的數組由make底層維護,對外不可見,即只能通過slice去訪問各個元素。

3.3方式三

定義一個切片,直接指定具體的數組,使用原理類似make的方式。

    var strSlice = []string{"java", "php", "golang"}fmt.Println(strSlice)fmt.Printf("類型:%T\n", strSlice)fmt.Println("長度:", len(strSlice))fmt.Println("容量:", cap(strSlice))

?結果:

[java php golang]
類型:[]string
長度: 3
容量: 3

3.4方式一和方式二的區別

1.方式一是直接引用數組,這個數組是事先存在的,程序員可見的。

2.方式二是通過make來創建切片,make也會船艦一個數組,是由七篇在底層進行維護的,程序員是看不見的。make創建切片的示意圖:

4.切片的擴容?

4.1append擴容

聲明一個切片,golang中沒辦法通過下標方式給切片擴容,需要用到append()方法.比如
    var sliceB []intsliceB[0] = 2 //golang中沒辦法通過下標方式給切片擴容,需要用到append()方法.

會報錯:panic: runtime error: index out of range [0] with length 0

    var sliceB []intsliceB = append(sliceB, 1)sliceB = append(sliceB, 123, 35, 67)fmt.Println(sliceB)fmt.Printf("長度:%v-容量:%v-%v-%T\n", len(sliceB), cap(sliceB), sliceB, sliceB)

結果:

[1 123 35 67]
長度:4-容量:4-[1 123 35 67]-[]int

4.2append方法合并切片

    sliceC := []string{"java", "go", "php"}sliceD := []string{"javad", "god", "phpd"}sliceC = append(sliceC, sliceD...)fmt.Println(sliceC)

?結果:

[java go php javad god phpd]

4.3切片的copy

已知切片是引用類型,更改切片的值會影響其他使用該切片的地方。

    sliceA := []string{"java", "php"}sleceB := sliceAvar sliceC = make([]string, 2, 2)//copy()切片的復制copy(sliceC, sliceA)sleceB[0] = "golang"fmt.Println("sliceA:", sliceA)fmt.Println("sleceB:", sleceB)fmt.Println("sliceC:", sliceC)

結果:由結果可以看出,當sliceB改變了,對sliceC沒有任何影響。

sliceA: [golang php]
sleceB: [golang php]
sliceC: [java php]

4.4切片的刪除

刪除下標為二的數據。

a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}a = append(a[:2], a[3:]...)fmt.Println(a)

?結果:

[1 2 4 5 6 7 8 9 0]

?4.5切片cap容量的理解

切片的容量是從他的第一個元素開始數,到其底層數組元素末尾的個數。

示例1:

    a := [8]int{0, 1, 2, 3, 4, 5, 6, 7} // 引用的底層數組s1 := a[0:5]fmt.Printf("長度:%v-容量:%v\n", len(s1), cap(s1))

結果:由結果可知長度5容量8,a[0:5],從數組a第一個下標一直數到a數組的末尾個數0-7即cap=8.

長度:5-容量:8

?

?示例2:

    a := [8]int{0, 1, 2, 3, 4, 5, 6, 7} // 引用的底層數組s2 := a[3:6]fmt.Printf("長度:%v-容量:%v\n", len(s2), cap(s2))

結果:由結果可知長度3容量5,a[3:6],從數組a第一個下標一直數到a數組的末尾個數3-7即cap=5.

長度:3-容量:5

5.切片的遍歷?

切片的遍歷和數組一樣,也有兩種方式。

方式1:

for i := 0; i < len(slice); i++ {fmt.Println(slice[i])}

方式2:

    slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}for _, value := range slice {fmt.Println(value)}

結果:

1
2
3
4
5
6
7
8
9

6.切片的使用注意事項和細節討論

7.1切片初始化是var slice=arr[stratIndex:endIndex]

說明:從arr數組小標圍毆startIndex,取到下標為endIndex的元素,不包含arr[endIndex]

7.2切片初始化是,仍然不能越界。范圍在[0-len(arr)]之間,但可以動態增長。

參考4.1append擴容

7.3cap是一個內置函數,用于統計切片的容量,即最大可以存放多少個元素。

?參考:4.5切片cap容量的理解

7.4切片定義完后,還不能直接使用,因為本身是一個空的,需要讓你、昂起引用到一個數組,或者,make?一個空間供切片使用。

7.5切片可以繼續切片

	A := []int{1, 2, 3, 4, 5, 6, 7, 8}B := A[3:8]C := A[:5]fmt.Println("B:", B)fmt.Println("C:", C)

結果:

B: [4 5 6 7 8]
C: [1 2 3 4 5]

7.6append()內置函數,可以對切片進行動態追加

用法:參考4.1、4.2

?切片append操作的底層原理分析:

切片append操作的本質就是對數組擴容,go底層會創建新的數組newArr(安裝擴容后的大小),

將slice原來包含的元素拷貝到新的數組newArr,slice重新引用到newArr,注意newarr是底層來維護的,程序員不可見。

7.7 關于拷貝的注意事項

var a []int = []int{1, 2, 3, 4, 5}var slice = make([]int, 1)copy(slice, a)fmt.Println(slice)

結果:

[1]

說明,上面代碼沒有問題,可以運行,最后輸出的是[1]

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

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

相關文章

游戲引擎學習第138天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 資產&#xff1a;game_hero_test_assets_003.zip 發布 我們的目標是展示游戲運行時的完整過程&#xff0c;從像素渲染到不使用GPU的方式&#xff0c;我們自己編寫了渲染器并完成了所有的工作。今天我們開始了一些新的內容&#…

畢業項目推薦:基于yolov8/yolov5/yolo11的暴力行為檢測識別系統(python+卷積神經網絡)

文章目錄 概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式&#xff09;功能6 支持切換檢測到的目標查看 二、數據集三、算法介紹1. YO…

docker中kibana啟動后,通過瀏覽器訪問,出現server is not ready yet

問題&#xff1a;當我在瀏覽器訪問kibana時&#xff0c;瀏覽器給我報了server is not ready yet. 在網上試了很多方法&#xff0c;都未能解決&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana從控制臺打印的日志可以發現&#xff…

在 Docker 中,無法直接將外部多個端口映射到容器內部的同一個端口

Docker 的端口映射是一對一的&#xff0c;即一個外部端口只能映射到容器內部的一個端口。 1. 為什么不能多對一映射&#xff1f; 端口沖突&#xff1a; 如果外部多個端口映射到容器內部的同一個端口&#xff0c;Docker 無法區分外部請求應該轉發到哪個內部端口&#xff0c;會…

游戲引擎學習第120天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 上次回顧&#xff1a;周期計數代碼 我們正在進行一個項目的代碼優化工作&#xff0c;目標是提高性能。當前正在優化某個特定的代碼片段&#xff0c;已經將其執行周期減少到48個周期。為了實現這一目標&#xff0c;我們設計了一個…

C++中的.h文件一般是干什么的?

在C中&#xff0c;.h 文件通常是 頭文件&#xff08;Header File&#xff09;&#xff0c;它們的主要作用是聲明類、函數、常量、宏以及其他在多個源文件&#xff08;.cpp文件&#xff09;之間共享的元素。頭文件提供了一個接口&#xff0c;使得不同的源文件能夠訪問這些共享的…

基礎算法總結

基礎算法總結 1、模擬1.1 什么是模擬算法1.2 算法題1.2.1 多項式輸出1.2.2 蛇形方陣 2 高精度算法2.1 什么是高精度算法2.2 算法題2.2.1 高精度加法 2.2.2 高精度乘法 3 普通枚舉3.1 算法題3.1.1 鋪地毯 3.1.2 回文日期 4 前綴和算法4.1 什么是前綴和4.2 算法題4.2.1 最大子段和…

密碼學(哈希函數)

4.1 Hash函數與數據完整性 數據完整性&#xff1a; 檢測傳輸消息&#xff08;加密或未加密&#xff09;的修改。 密碼學Hash函數&#xff1a; 構建某些數據的簡短“指紋”&#xff1b;如果數據被篡改&#xff0c;則該指紋&#xff08;以高概率&#xff09;不再有效。Hash函數…

游戲引擎學習第135天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 回顧 game_asset.cpp 的創建 在開發過程中&#xff0c;不使用任何現成的游戲引擎或第三方庫&#xff0c;而是直接基于 Windows 進行開發&#xff0c;因為 Windows 目前仍然是游戲的標準平臺&#xff0c;因此首先在這個環境中進行…

Linux:文件描述符與重定向

目錄 一、文件描述符 1.文件內核對象 2.文件描述符分配原則 二、文件重定向 1.重定向的現象 輸出重定向 輸入重定向 dup2 2.重定向的使用 三、標準輸出和標準錯誤 繼上篇文章中&#xff0c;我們了解了fd打印的值為文件描述符&#xff0c;那么它還有什么作用呢&…

白盒測試(3):PCB阻抗測試方法

PCB阻抗測試是確保信號完整性的關鍵&#xff0c;通過測量走線的特性阻抗&#xff0c;驗證其是否符合設計目標。常用方法包括時域反射法&#xff08;TDR&#xff09;、網絡分析儀法和仿真軟件法。TDR通過分析反射信號定位阻抗異常&#xff0c;網絡分析儀通過S參數計算阻抗&#…

CentOS 7 安裝Nginx-1.26.3

無論安裝啥工具、首先認準了就是官網。Nginx Nginx官網下載安裝包 Windows下載&#xff1a; http://nginx.org/download/nginx-1.26.3.zipLinxu下載 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安裝Nginx-1.26.3 安裝之前先安裝Nginx依賴包、自行選擇 yum -y i…

筆記:如何使用XAML Styler以及在不同的開發環境中使用一致

一、目的&#xff1a;分享如何使用XAML Styler以及在不同的開發環境中使用一致 XAML Styler 是一個 Visual Studio 擴展&#xff0c;用于自動格式化和整理 XAML 文件。它可以幫助開發者保持一致的代碼風格&#xff0c;提高代碼的可讀性和可維護性。以下是如何在 Visual Studio …

分布式存儲學習——HBase概述

1.1 HBase概述 1.1.1 理解大數據背景 1.1.2 HBase是什么 1.1.3 HBase與Hadoop的關系 1.1.4 HBase的核心功能模塊 1.1.5 HBase的應用場景和經典案例 1.1.6 小結 本文參考于學校《HBase應用于開發》教材 1.1 HBase概述 本節將介紹大數據背景和HBase的基本概念&#xff0c…

交叉編譯openssl及curl

操作環境&#xff1a;Ubuntu20.04 IDE工具&#xff1a;Clion2020.2 curl下載地址&#xff1a;https://curl.se/download/ openssl下載地址&#xff1a;https://openssl-library.org/source/old/index.html 直接交叉編譯curl會報錯找不到openssl&#xff0c;所以需要先交叉編…

MDM 如何徹底改變醫療設備的遠程管理

在現代醫療行業迅速發展的格局中&#xff0c;醫院和診所越來越依賴諸如醫療平板和移動工作站等移動設備。這些設備在提高工作效率和提供卓越的患者護理方面發揮著關鍵作用。然而&#xff0c;隨著它們的廣泛使用&#xff0c;也帶來了一系列挑戰&#xff0c;例如在不同地點確保數…

零基礎C語言學習日志22(自定義類型:聯合和枚舉)

目錄 聯合體 聯合體類型的聲明 聯合體的特點 相同成員聯合體和結構體的對比 聯合體大小的計算 例子 枚舉類型 枚舉類型的聲明 枚舉類型的優點 枚舉類型的使用 聯合體 聯合體類型的聲明 像結構體一樣&#xff0c;聯合體也是由一個或者多個成員構成&#xff0c;這些成…

天津大學02-深度解讀DeepSeek:部署、使用、安全【文末附下載鏈接】

大模型風險與不當用例——價值觀錯位 大模型與人類價值觀、期望之間的不一致而導致的安全問題&#xff0c;包含&#xff1a;? 社會偏見&#xff08;Social Bias&#xff09;LLM在生成文本時強化對特定社會群體的刻板印象&#xff0c;例如將穆斯林與恐怖主義關聯&#xff0c;或…

[C語言日寄] 字符串操作函數的使用及其拓展

【作者主頁】siy2333 【專欄介紹】?c語言日寄?&#xff1a;這是一個專注于C語言刷題的專欄&#xff0c;精選題目&#xff0c;搭配詳細題解、拓展算法。從基礎語法到復雜算法&#xff0c;題目涉及的知識點全面覆蓋&#xff0c;助力你系統提升。無論你是初學者&#xff0c;還是…

Qt 進度條與多線程應用、基于 Qt 的文件復制工具開發

練習1&#xff1a;Qt 進度條與多線程應用 題目描述 開發一個基于 Qt 的應用程序&#xff0c;該應用程序包含一個水平進度條&#xff08;QSlider&#xff09;&#xff0c;并且需要通過多線程來更新進度條的值。請根據以下要求完成代碼&#xff1a; 界面設計&#xff1a; 使用 QS…