網站首頁 編程語言 正文
一、數組和切片的區別是什么?
1.數組
數組是內置(build-in)類型,是一組同類型數據的集合,它是值類型,通過從0開始的下標索引訪問元素值。在初始化后長度是固定的,無法修改其長度。當作為方法的參數傳入時將復制一份數組而不是引用同一指針。數組的長度也是其類型的一部分,通過內置函數len(array)獲取其長度。
2.切片
Slices切片(“動態數組")也是內置類型,但與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。切片是引用類型,因此在當傳遞切片時將引用同一指針,修改值將會影響其他的對象。
切片中有兩個概念:
- len長度,長度是指已經被賦過值的最大下標+1,可通過內置函數len()獲得。
- cap容量,容量是指切片目前可容納的最多元素個數,可通過內置函數cap()獲得。
二、數組和切片的初始化?
1.數組
package main import "fmt" func main() { //初始化數組的初始化有多種形式,查看示例代碼 a0 := [5]int{1, 2, 3, 4, 5} //長度為5的數組,其元素值依次為:1,2,3,4,5 // [1 2 3 4 5] a1 := [5]int{1, 2} //長度為5的數組,其元素值依次為:1,2,0,0,0 。 //未指定初值的元素將會賦初值 //int的默認值0,string的默認值是"" //[1 2 0 0 0] a2 := [...]int{1, 2, 3, 4, 5} //長度為5的數組,其長度是根據初始化時指定的元素個數決定的 // [...] 長度不固定,根據元素個數改變 // [1 2 3 4 5] a3 := [5]int{2: 1, 3: 2, 4: 3} //長度為5的數組,key:value, //key:value 2 : 1 即 a3[2] = 1 // 3 : 2 即 a3[3] = 2 // [0 0 1 2 3] a4 := [...]int{2: 1, 4: 3} //長度為5的數組,起元素值依次為:0,0,1,0,3。由于指定了最大索引4對應的值3,根據初始化的元素個數確定其長度為5賦值與使用 // [...] 長度不固定,根據元素個數改變 // key:value 4 : 3 即 a4[4] = 3 // 所以需要有 5 個元素,即長度 [5]int // [0 0 1 0 3] fmt.Println(a0, a1, a2, a3, a4) }
2.切片
package main import "fmt" func main() { s0 :=[]int {1,2,3 } //[1 2 3] //直接初始化切片,[]表示是切片類型,{1,2,3}初始化值依次是1,2,3 fmt.Println(cap(s0),len(s0)) //cap=len=3 s1 := s0[:] //[1 2 3] //初始化切片s,是數組arr的引用 fmt.Println(cap(s1),len(s1)) //cap=len=3 s2 := s0[1:2] //[2] //將arr中從下標startIndex到endIndex-1 下的元素創建為一個新的切片 fmt.Println(cap(s2),len(s2)) //cap=2 len=1 s3 := s0[1:] //[2 3] //缺省endIndex時將表示一直到arr的最后一個元素 fmt.Println(cap(s3),len(s3)) //cap=len=2 s4 := s0[:2] //[1 2] //缺省startIndex時將表示從arr的第一個元素開始 fmt.Println(cap(s4),len(s4)) //cap=3 len=2 s5 := s4[:] //[1 2] //通過切片s初始化切片s1 fmt.Println(cap(s5),len(s5)) //cap=3 len=2 s6 :=make([]int,1,2) //[0] //通過內置函數make()初始化切片s,[]int 標識為其元素類型為int的切片 fmt.Println(cap(s6),len(s6)) //cap=2 len=1 fmt.Println(s0,s1,s2,s3,s4,s5,s6) }
二、常見問題
1.切片的初始化與追加
代碼如下(示例):
package main import "fmt" func main() { // 由初始化已知,此時len(s) = 10 cap(s) = 10 // make 那么此時 int 已有初值 0 s := make([]int, 10) // 在末尾插入三個元素 1,2,3 s = append(s, 1, 2, 3) // [0 0 0 0 0 0 0 0 0 0 1 2 3] fmt.Println(s) }
2.slice拼接問題
代碼如下(示例):
package main import "fmt" func main() { // 三元素切片 s1 := []int{1, 2, 3} // 兩元素切片 s2 := []int{4, 5} // 將 s2 兩元素從末尾插入 s1 // s2... 即將 s2 導出 // s2... 此時 4,5 s1 = append(s1, s2...) fmt.Println(s1) }
3.new和make的區別
二者都是內存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于類型的內存分配,并且內存置為零。所以在我們編寫程序的時候,就可以根據自己的需要很好的選擇了。
make返回的還是這三個引用類型本身;而new返回的是指向類型的指針。
總結
通過以上兩個例子可以輕松了解在Golang中數組和切片的正常形式與簡單初始化。
原文鏈接:https://blog.csdn.net/moer0/article/details/123012169
相關推薦
- 2022-06-12 Python多線程的使用詳情_python
- 2022-09-12 shell腳本5種執行方式及腳本不同的執行方法和區別詳解_linux shell
- 2021-12-20 使用Docker構建開發環境的方法步驟(?Windows和mac)_docker
- 2022-05-10 react使用require圖片無法加載
- 2022-10-20 三種Golang數組拷貝方式及性能分析詳解_Golang
- 2022-10-24 C語言進程程序替換的實現詳解_C 語言
- 2022-04-18 uniapp中使用拷貝,復制粘貼功能,uniapp,隱藏軟鍵盤
- 2022-09-26 Python文件相關操作和方法匯總大全_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支