成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言數組和切片的區別

開發 前端
數組是一個長度固定的數據類型,其長度在定義時就已經確定,不能動態改變;切片是一個長度可變的數據類型,其長度在定義時可以為空,也可以指定一個初始長度。

在 Go 語言中,數組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。

另外,這個問題在面試中也經常會被問到,屬于入門級題目,看過文章之后,相信你會有一個很好的答案。

數組

數組是同一種數據類型元素的集合,數組在定義時需要指定長度和元素類型。

圖片

例如:[4]int? 表示一個包含四個整數的數組,數組的大小是固定的。并且長度是其類型的一部分([4]int? 和 [5]int 是不同的、不兼容的類型)。

數組元素可以通過索引來訪問,比如表達式 s[n]? 表示訪問第 n 個元素,索引從零開始。

聲明以及初始化

func main() {
var nums [3]int // 聲明并初始化為默認零值
var nums1 = [4]int{1, 2, 3, 4} // 聲明同時初始化
var nums2 = [...]int{1, 2, 3, 4, 5} // ...可以表示后面初始化值的長度
fmt.Println(nums) // [0 0 0]
fmt.Println(nums1) // [1 2 3 4]
fmt.Println(nums2) // [1 2 3 4 5]
}

函數參數

如果數組作為函數的參數,那么實際傳遞的是一份數組的拷貝,而不是數組的指針。這也就意味著,在函數中修改數組的元素是不會影響到原始數組的。

圖片

package main

import (
"fmt"
)

func Add(numbers [5]int) {
for i := 0; i < len(numbers); i++ {
numbers[i] = numbers[i] + 1
}
fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
}

func main() {
// declare and initialize the array
var numbers [5]int
for i := 0; i < len(numbers); i++ {
numbers[i] = i + 1
}

Add(numbers)
fmt.Println("numbers in main:", numbers) // [1 2 3 4 5]
}

切片

數組的使用場景相對有限,切片才更加常用。

切片(Slice)是一個擁有相同類型元素的可變長度的序列。它是基于數組類型做的一層封裝。它非常靈活,支持自動擴容。

圖片

切片是一種引用類型,它有三個屬性:指針,長度和容量。

  1. 指針:指向 slice 可以訪問到的第一個元素。
  2. 長度:slice 中元素個數。
  3. 容量:slice 起始元素到底層數組最后一個元素間的元素個數。

底層源碼定義如下:

type slice struct {
array unsafe.Pointer
len int
cap int
}

聲明以及初始化

func main() {
var nums []int // 聲明切片
fmt.Println(len(nums), cap(nums)) // 0 0
nums = append(nums, 1) // 初始化
fmt.Println(len(nums), cap(nums)) // 1 1

nums1 := []int{1,2,3,4} // 聲明并初始化
fmt.Println(len(nums1), cap(nums1)) // 4 4

nums2 := make([]int,3,5) // 使用make()函數構造切片
fmt.Println(len(nums2), cap(nums2)) // 3 5
}

函數參數

當切片作為函數參數時,和數組是不同的,如果一個函數接受一個切片參數,它對切片元素所做的更改將對調用者可見,類似于將指針傳遞給了底層數組。

package main

import (
"fmt"
)

func Add(numbers []int) {
for i := 0; i < len(numbers); i++ {
numbers[i] = numbers[i] + 1
}
fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
}

func main() {
var numbers []int
for i := 0; i < 5; i++ {
numbers = append(numbers, i+1)
}

Add(numbers)

fmt.Println("numbers in main:", numbers) // [2 3 4 5 6]
}

再看一下上面的例子,把參數由數組變成切片,Add? 函數中的修改會影響到 main 函數。

總結

最后來總結一下,面試時也可以這么來回答:

  1. 數組是一個長度固定的數據類型,其長度在定義時就已經確定,不能動態改變;切片是一個長度可變的數據類型,其長度在定義時可以為空,也可以指定一個初始長度。
  2. 數組的內存空間是在定義時分配的,其大小是固定的;切片的內存空間是在運行時動態分配的,其大小是可變的。
  3. 當數組作為函數參數時,函數操作的是數組的一個副本,不會影響原始數組;當切片作為函數參數時,函數操作的是切片的引用,會影響原始切片。
  4. 切片還有容量的概念,它指的是分配的內存空間。

以上就是本文的全部內容,如果覺得還不錯的話歡迎點贊,轉發和關注,感謝支持。

參考文章:

  • https://go.dev/doc/effective_go#arrays
  • https://go.dev/blog/slices-intro
  • https://levelup.gitconnected.com/go-programming-array-vs-slice-5902b7fdd436

責任編輯:武曉燕 來源: AlwaysBeta
相關推薦

2022-06-02 13:54:04

Go數組切片

2021-07-13 06:44:04

Go語言數組

2024-05-17 08:47:33

數組切片元素

2024-06-13 09:10:22

2021-04-09 10:38:59

Go 語言數組與切片

2023-04-03 08:02:16

切片擴容GO

2021-05-12 08:47:54

Go數組切片

2023-12-27 08:12:04

切片Go語言

2018-08-20 08:15:50

編程語言Go語言切片

2024-01-09 16:14:39

RustGo切片

2022-04-06 08:19:13

Go語言切片

2022-10-27 19:32:20

切片golang數組

2023-03-24 08:01:27

Go語言內存

2022-11-10 07:43:45

2024-10-15 08:57:08

Go語言切片

2025-02-06 13:19:31

RustPin系統

2022-02-09 16:02:26

Go 語言ArraySlice

2022-02-14 08:25:50

Go語言面試

2024-01-02 10:38:22

Go語言數組

2018-04-19 14:54:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天夜夜人人 | 国产免费观看一级国产 | 9久9久| 欧美日韩视频在线 | 日韩视频一区在线观看 | 日韩欧美一区二区三区四区 | 成人区精品 | 亚洲精品在线免费播放 | 天天躁日日躁狠狠很躁 | 欧美日韩亚洲一区 | 亚洲精品一区二区三区四区高清 | 欧美国产日韩一区二区三区 | 国产日韩久久 | 999久久久 | 国产亚洲一区二区三区在线观看 | 亚洲精品久久久一区二区三区 | 免费观看av | 亚洲精品区 | 在线午夜 | 伊人免费视频二 | 免费黄网站在线观看 | 992人人草| 亚洲国产视频一区二区 | 亚洲精品一区二区三区在线观看 | 免费日韩网站 | 日韩久久久久久久 | 91在线成人 | 中文在线一区二区 | 国产精品久久av | 一区二区久久电影 | 黄色免费在线观看网址 | 亚洲九色 | 999久久久久久久久6666 | 成人在线欧美 | 国产三级一区二区三区 | 性色av香蕉一区二区 | 午夜男人免费视频 | 国产精品免费观看 | 一区二区亚洲 | 综合久久综合久久 | 在线免费观看视频黄 |