亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go 語(yǔ)言數(shù)組和切片的區(qū)別詳解

 更新時(shí)間:2023年04月02日 12:20:02   作者:yongxinz  
本文主要介紹了Go 語(yǔ)言數(shù)組和切片的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在 Go 語(yǔ)言中,數(shù)組和切片看起來(lái)很像,但其實(shí)它們又有很多的不同之處,這篇文章就來(lái)說(shuō)說(shuō)它們到底有哪些不同。

另外,這個(gè)問(wèn)題在面試中也經(jīng)常會(huì)被問(wèn)到,屬于入門(mén)級(jí)題目,看過(guò)文章之后,相信你會(huì)有一個(gè)很好的答案。

數(shù)組

數(shù)組是同一種數(shù)據(jù)類(lèi)型元素的集合,數(shù)組在定義時(shí)需要指定長(zhǎng)度和元素類(lèi)型。

例如:[4]int 表示一個(gè)包含四個(gè)整數(shù)的數(shù)組,數(shù)組的大小是固定的。并且長(zhǎng)度是其類(lèi)型的一部分([4]int[5]int 是不同的、不兼容的類(lèi)型)。

數(shù)組元素可以通過(guò)索引來(lái)訪問(wèn),比如表達(dá)式 s[n] 表示訪問(wèn)第 n 個(gè)元素,索引從零開(kāi)始。

聲明以及初始化

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

函數(shù)參數(shù)

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

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]
}

切片

數(shù)組的使用場(chǎng)景相對(duì)有限,切片才更加常用。

切片(Slice)是一個(gè)擁有相同類(lèi)型元素的可變長(zhǎng)度的序列。它是基于數(shù)組類(lèi)型做的一層封裝。它非常靈活,支持自動(dòng)擴(kuò)容。

切片是一種引用類(lèi)型,它有三個(gè)屬性:指針,長(zhǎng)度容量。

  • 指針:指向 slice 可以訪問(wèn)到的第一個(gè)元素。
  • 長(zhǎng)度:slice 中元素個(gè)數(shù)。
  • 容量:slice 起始元素到底層數(shù)組最后一個(gè)元素間的元素個(gè)數(shù)。

底層源碼定義如下:

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()函數(shù)構(gòu)造切片
    fmt.Println(len(nums2), cap(nums2))    // 3 5
}

函數(shù)參數(shù)

當(dāng)切片作為函數(shù)參數(shù)時(shí),和數(shù)組是不同的,如果一個(gè)函數(shù)接受一個(gè)切片參數(shù),它對(duì)切片元素所做的更改將對(duì)調(diào)用者可見(jiàn),類(lèi)似于將指針傳遞給了底層數(shù)組。

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]
}

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

總結(jié)

最后來(lái)總結(jié)一下,面試時(shí)也可以這么來(lái)回答:

  • 數(shù)組是一個(gè)長(zhǎng)度固定的數(shù)據(jù)類(lèi)型,其長(zhǎng)度在定義時(shí)就已經(jīng)確定,不能動(dòng)態(tài)改變;切片是一個(gè)長(zhǎng)度可變的數(shù)據(jù)類(lèi)型,其長(zhǎng)度在定義時(shí)可以為空,也可以指定一個(gè)初始長(zhǎng)度。
  • 數(shù)組的內(nèi)存空間是在定義時(shí)分配的,其大小是固定的;切片的內(nèi)存空間是在運(yùn)行時(shí)動(dòng)態(tài)分配的,其大小是可變的。
  • 當(dāng)數(shù)組作為函數(shù)參數(shù)時(shí),函數(shù)操作的是數(shù)組的一個(gè)副本,不會(huì)影響原始數(shù)組;當(dāng)切片作為函數(shù)參數(shù)時(shí),函數(shù)操作的是切片的引用,會(huì)影響原始切片。
  • 切片還有容量的概念,它指的是分配的內(nèi)存空間。

以上就是本文的全部?jī)?nèi)容,如果覺(jué)得還不錯(cuò)的話(huà)歡迎點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注,感謝支持。

參考文章:

 到此這篇關(guān)于Go 語(yǔ)言數(shù)組和切片的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Go 數(shù)組和切片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go項(xiàng)目打包部署的完整步驟

    go項(xiàng)目打包部署的完整步驟

    之前斷斷續(xù)續(xù)的接觸到項(xiàng)目部署,一直沒(méi)有詳細(xì)的了解部署,于是最近就好好的專(zhuān)研一下項(xiàng)目的部署,下面這篇文章主要給大家介紹了關(guān)于go項(xiàng)目打包部署的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Golang?strings包常用字符串操作函數(shù)

    Golang?strings包常用字符串操作函數(shù)

    Golang?中的字符串統(tǒng)一使用?UTF-8?(屬于Unicode編碼的一種實(shí)現(xiàn)方式)進(jìn)行編碼,本篇文章將結(jié)合具體實(shí)例對(duì)常用的字符串操作函數(shù)進(jìn)行介紹,感興趣的可以了解一下
    2021-12-12
  • 一文帶你了解Go中跟蹤函數(shù)調(diào)用鏈的實(shí)現(xiàn)

    一文帶你了解Go中跟蹤函數(shù)調(diào)用鏈的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了go如何實(shí)現(xiàn)一個(gè)自動(dòng)注入跟蹤代碼,并輸出有層次感的函數(shù)調(diào)用鏈跟蹤命令行工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • go判斷文件夾是否存在并創(chuàng)建的實(shí)例

    go判斷文件夾是否存在并創(chuàng)建的實(shí)例

    這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go gRPC超時(shí)控制Deadlines用法詳解

    Go gRPC超時(shí)控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時(shí)控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go ORM的封裝解決方式詳解

    Go ORM的封裝解決方式詳解

    這篇文章主要為大家介紹了Go ORM的封裝解決方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • golang連接kafka的示例代碼

    golang連接kafka的示例代碼

    本文主要介紹了golang連接kafka的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • golang?Gorm框架講解

    golang?Gorm框架講解

    gorm是一個(gè)使用Go語(yǔ)言編寫(xiě)的ORM框架,這篇文章主要介紹了golang?Gorm框架,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • golang atomic原子操作示例詳解

    golang atomic原子操作示例詳解

    這篇文章主要為大家介紹了golang atomic原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)

    golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)

    golang內(nèi)置類(lèi)型有rune類(lèi)型和byte類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03

最新評(píng)論