欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang中切片長(zhǎng)度和容量的區(qū)別示例詳解

 更新時(shí)間:2024年01月24日 10:53:58   作者:Nex1395  
切片長(zhǎng)度與容量在Go中很常見(jiàn),切片長(zhǎng)度是切片中可用元素的數(shù)量,而切片容量是從切片中第一個(gè)元素開(kāi)始計(jì)算的底層數(shù)組中的元素?cái)?shù)量,這篇文章主要給大家介紹了關(guān)于Golang中切片長(zhǎng)度和容量區(qū)別的相關(guān)資料,需要的朋友可以參考下

首先要知道在Golang中,切片的底層實(shí)際就是數(shù)組。

1.切片的長(zhǎng)度:

切片的長(zhǎng)度指切片中元素的數(shù)量,可以使用len()函數(shù)查詢其切片的長(zhǎng)度。

示例1:

package main

import "fmt"

func main(){
    slice := []int{1,3,2,6,4}
    # 調(diào)用len查看長(zhǎng)度
    length := len(slice)
    fmt.Printf("slice01的長(zhǎng)度是:%v", length)
}

// 輸出結(jié)果
// slice的長(zhǎng)度是:5

在上面代碼中,變量length就是切片的長(zhǎng)度(結(jié)果是5)

2.切片的容量:

切片的容量是指切片底層數(shù)組的長(zhǎng)度,可以使用cap()函數(shù)查看容量

示例2:

package main

import "fmt"

func main(){
    slice := []int{1,3,2,6,4}
    // 調(diào)用cap查看容量
    capacity := cap(slice)
    fmt.Printf("slice01的容量是:%v", capacity)
}

// 輸出結(jié)果
// slice的容量是:5

在上面代碼中,變量capacity就是切片的容量(結(jié)果也是5)

3.通過(guò)上面兩個(gè)示例看不出區(qū)別,我們看下面的示例:

示例3

package main

import "fmt"

func main(){
    // 通過(guò)make函數(shù)來(lái)創(chuàng)建slice, 4表示切片的長(zhǎng)度, 10標(biāo)識(shí)切片的容量
    slice := make([]int, 4, 6)
    length := len(slice)
    capacity := cap(slice)
    fmt.Printf("slice01的長(zhǎng)度是:%v\n", length)
    fmt.Printf("slice01的容量是:%v\n", capacity)
}

// 輸出結(jié)果
// slice01的長(zhǎng)度是:4
// slice01的容量是:6

你可以想象成:當(dāng)執(zhí)行slice := make([]int, 4, 10)的時(shí)候,程序在底層創(chuàng)建了一個(gè)長(zhǎng)度為6的數(shù)組,切片slice引用了前面4個(gè)元素,就生成了slice這個(gè)切片,當(dāng)前切片值是:{0, 0, 0, 0},剩下的2個(gè)元素則暫時(shí)沒(méi)有引用。

4.通過(guò)對(duì)切片的增加,查看切片與底層數(shù)組的變化

我們知道,golang中切片和數(shù)組的主要區(qū)別在于數(shù)組是定長(zhǎng)的,切片是變長(zhǎng)的。但我們?cè)?strong>示例3中定義了切片的容量是6,那如果超過(guò)6個(gè)元素了,將會(huì)發(fā)生什么呢?

示例4

package main

import "fmt"

func main(){
    // 通過(guò)make函數(shù)來(lái)創(chuàng)建slice, 4表示切片的長(zhǎng)度, 10標(biāo)識(shí)切片的容量
    slice := make([]int, 4, 6)
    length := len(slice)
    capacity := cap(slice)
    fmt.Printf("slice01的長(zhǎng)度是:%v\n", length)
    fmt.Printf("slice01的容量是:%v\n", capacity)
    
    //第一次向切片slice內(nèi)添加元素
    slice = append(slice, 1)
    //打印slice的長(zhǎng)度,容量,內(nèi)存地址(slice[0]的內(nèi)存地址)
    fmt.Printf("\n\n第一次結(jié)果:")
    fmt.Printf("slice的長(zhǎng)度是:%v\n", len(slice))
    fmt.Printf("slice的容量是:%v\n", cap(slice))
    fmt.Printf("slice的內(nèi)存地址是:%v\n", &slice[0])
    
    // 第二次向slice內(nèi)添加元素
    slice = append(slice, 1)
    //打印slice的長(zhǎng)度,容量,內(nèi)存地址(slice[0]的內(nèi)存地址)
    fmt.Printf("\n\n第二次結(jié)果:")
    fmt.Printf("slice的長(zhǎng)度是:%v\n", len(slice))
    fmt.Printf("slice的容量是:%v\n", cap(slice))
    fmt.Printf("slice的內(nèi)存地址是:%v\n", &slice[0])
    
    // 第三次向slice內(nèi)添加元素
    slice = append(slice, 1)
    //打印slice的長(zhǎng)度,容量,內(nèi)存地址(slice[0]的內(nèi)存地址)
    fmt.Printf("\n\n第三次結(jié)果:")
    fmt.Printf("slice的長(zhǎng)度是:%v\n", len(slice))
    fmt.Printf("slice的容量是:%v\n", cap(slice))
    fmt.Printf("slice的內(nèi)存地址是:%v\n", &slice[0])
}

// slice01的長(zhǎng)度是:4
// slice01的容量是:6


// 第一次結(jié)果:slice的長(zhǎng)度是:5
// slice的容量是:6
// slice的內(nèi)存地址是:0xc00000e390


// 第二次結(jié)果:slice的長(zhǎng)度是:6
// slice的容量是:6
// slice的內(nèi)存地址是:0xc00000e390


// 第三次結(jié)果:slice的長(zhǎng)度是:7
// slice的容量是:12
// slice的內(nèi)存地址是:0xc000060060

通過(guò)示例4我們可以發(fā)現(xiàn):我們初始化切片長(zhǎng)度為4, 容量為6的時(shí)候。

當(dāng)?shù)谝淮魏偷诙蜗蚯衅瑑?nèi)添加元素后,只有切片的長(zhǎng)度增加,容量和內(nèi)存地址都沒(méi)改變

當(dāng)?shù)谌蜗蚯衅瑑?nèi)添加元素后,長(zhǎng)度增加了1,容量變成了之前的2倍,內(nèi)存地址也發(fā)生了改變。

由此我們可以推斷出:

**總結(jié):**當(dāng)切片的元素長(zhǎng)度超過(guò)了默認(rèn)的容量之后,程序會(huì)重新創(chuàng)建一個(gè)底層數(shù)組和切片綁定,且新的數(shù)組的長(zhǎng)度為原來(lái)的兩倍(切片的容量變成原來(lái)的兩倍)

5. 注意用法:

示例5

package main

import "fmt"

func main() {
	slice := make([]int, 4, 4)
	slice2 := make([]int, 4, 5)
    // 調(diào)用下方定義的test函數(shù)
	test(slice)
	test(slice2)

	// 輸出兩個(gè)切片調(diào)用test函數(shù)后的結(jié)果
	fmt.Printf("slice的結(jié)果: %v\n", slice)
	fmt.Printf("slice2的結(jié)果: %v\n", slice2)

}

func test(s []int) {
	s = append(s, 1)
	for i := 0; i < len(s); i++ {
		s[i] = 100
	}
}

// slice的結(jié)果: [0 0 0 0]
// slice2的結(jié)果: [100 100 100 100]

切片容量不同,導(dǎo)致了最終結(jié)果不同。

總結(jié)

到此這篇關(guān)于Golang中切片長(zhǎng)度和容量區(qū)別的文章就介紹到這了,更多相關(guān)Golang切片長(zhǎng)度和容量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang pipe在不同場(chǎng)景下遠(yuǎn)程交互

    Golang pipe在不同場(chǎng)景下遠(yuǎn)程交互

    這篇文章主要介紹了Golang pipe在不同場(chǎng)景下遠(yuǎn)程交互,pipe實(shí)現(xiàn)從一個(gè)進(jìn)程重定向至另一個(gè)進(jìn)程,它是雙向數(shù)據(jù)通道,用于實(shí)現(xiàn)進(jìn)行間通信
    2023-03-03
  • go語(yǔ)言中range用法

    go語(yǔ)言中range用法

    這篇文章主要介紹了go語(yǔ)言中range用法,實(shí)例分析了Go語(yǔ)言中range的功能及使用技巧,需要的朋友可以參考下
    2015-03-03
  • gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題(最新推薦)

    gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題(最新推薦)

    這篇文章主要介紹了gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Golang為什么占用那么多的虛擬內(nèi)存原理解析

    Golang為什么占用那么多的虛擬內(nèi)存原理解析

    這篇文章主要介紹了Golang為什么占用那么多的虛擬內(nèi)存原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解

    Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解

    這篇文章主要為大家介紹了Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Go語(yǔ)言解決Scan空格結(jié)束輸入問(wèn)題

    使用Go語(yǔ)言解決Scan空格結(jié)束輸入問(wèn)題

    這篇文章主要為大家介紹了使用Go語(yǔ)言來(lái)解決Scan空格結(jié)束輸入問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Go實(shí)現(xiàn)并發(fā)緩存的示例代碼

    Go實(shí)現(xiàn)并發(fā)緩存的示例代碼

    高并發(fā)數(shù)據(jù)存儲(chǔ)是現(xiàn)代互聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)中常遇到的一大挑戰(zhàn),本文主要介紹了Go實(shí)現(xiàn)并發(fā)緩存的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 利用systemd部署golang項(xiàng)目的實(shí)現(xiàn)方法

    利用systemd部署golang項(xiàng)目的實(shí)現(xiàn)方法

    這篇文章主要介紹了利用systemd部署golang項(xiàng)目的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • go語(yǔ)言中os包的用法實(shí)戰(zhàn)大全

    go語(yǔ)言中os包的用法實(shí)戰(zhàn)大全

    Go在os中提供了文件的基本操作,包括通常意義的打開(kāi)、創(chuàng)建、讀寫(xiě)等操作,除此以外為了追求便捷以及性能上,Go還在io/ioutil以及bufio提供一些其他函數(shù)供開(kāi)發(fā)者使用,這篇文章主要給大家介紹了關(guān)于go語(yǔ)言中os包用法的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • go語(yǔ)言打包的網(wǎng)頁(yè)wasm示例詳解

    go語(yǔ)言打包的網(wǎng)頁(yè)wasm示例詳解

    這篇文章主要為大家介紹了go打包網(wǎng)頁(yè)wasm示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-09-09

最新評(píng)論