最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語(yǔ)言中切片Slice與數(shù)組Array對(duì)比以及panic:?runtime?error:?index?out?of?range問題解決

 更新時(shí)間:2022年07月20日 10:28:31   作者:大錘愛編程  
go語(yǔ)言中數(shù)組與其他語(yǔ)言有在顯著的不同,包括其不能夠進(jìn)行添加,以及值拷貝的特性,下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言中切片Slice與數(shù)組Array對(duì)比以及panic:?runtime?error:?index?out?of?range問題解決的相關(guān)資料,需要的朋友可以參考下

前言

在go語(yǔ)言的學(xué)習(xí)歷程當(dāng)中,slice數(shù)據(jù)類型引起了我的好奇心。為啥不直接使用Slice,是人性的扭曲還是道德的淪喪~,下面讓我們一探究竟~~

一、go slice是什么

go語(yǔ)言中的slice是一個(gè)基于Array封裝的數(shù)據(jù)結(jié)構(gòu),go語(yǔ)言中slice的使用頻率遠(yuǎn)高于array,其身影頻頻出現(xiàn)在源碼實(shí)現(xiàn)當(dāng)中。slice相對(duì)于Array的優(yōu)點(diǎn)就是其可以動(dòng)態(tài)調(diào)整自己的size,不像Array的Size是固定的。

二、go slice實(shí)戰(zhàn)案例

1.slice創(chuàng)建、使用

slice的創(chuàng)建有兩個(gè)方法分別是使用字面量定義和使用make函數(shù)。除過slice創(chuàng)建,其他slice的生成辦法均是從現(xiàn)有slice分片或者array上做slice分片操作。

slice創(chuàng)建代碼:

package main
 
import (
	"fmt"
	"reflect"
)
 
func main() {
	//字面創(chuàng)造Slice
	sliceOne := []string{"a", "b"}
	//使用make函數(shù)創(chuàng)造slice
	sliceTwo := make([]string, 10)
	sliceThree := make([]int, 10)
 
	fmt.Printf("使用字面量創(chuàng)建的slice%s\n",reflect.ValueOf(sliceOne).String())
	fmt.Printf("使用make函數(shù)創(chuàng)建的slice:%s\n",reflect.ValueOf(sliceTwo).String())
	fmt.Printf("使用make函數(shù)創(chuàng)建的slice:%s\n",reflect.ValueOf(sliceThree).String())
 
}

程序輸出:

使用字面量創(chuàng)建的slice<[]string Value>
使用make函數(shù)創(chuàng)建的slice:<[]string Value>
使用make函數(shù)創(chuàng)建的slice:<[]int Value>
 
Process finished with the exit code 0

2、slice的長(zhǎng)度和容量概念理解

學(xué)習(xí)過程中,很多小伙伴會(huì)對(duì)slice的長(zhǎng)度和容量問題有著很多混淆。

這個(gè)地方可以把切片比喻成一個(gè)可以裝10個(gè)蘋果的袋子,現(xiàn)在的袋子里面有三顆蘋果。切片的長(zhǎng)度就是袋子已經(jīng)裝的果子的個(gè)數(shù),目前是3個(gè)。切片的容量就是這個(gè)袋子一共能裝多少個(gè)果子,對(duì)于這個(gè)袋子來(lái)說就是10。那么把代碼替換成切片,把蘋果替換成元素,是不是就懂了撒~

下面就是該問題的處理辦法就是直接去官方,看源碼??纯吹谝皇仲Y料怎么講!

長(zhǎng)度:slice中擁有的元素個(gè)數(shù),如果slice是nil的話,則元素個(gè)數(shù)長(zhǎng)度是0
英文:the number of elements in v; if v is nil, len(v) is zero

容量:slice切片的長(zhǎng)度能夠到達(dá)的最大值
英文:Slice: the maximum length the slice can reach when resliced;

代碼驗(yàn)證環(huán)節(jié):

package main
 
import (
    "fmt"
 )
 
func main() {
    sliceOne := []string{"a", "b"}
    strings := sliceOne[0:1]
    fmt.Printf("切片的長(zhǎng)度:%d\n",len(strings))
    fmt.Printf("切片的容量:%d\n",cap(strings))
}

代碼結(jié)果輸出:

切片的長(zhǎng)度:1
切片的容量:2

代碼原理解析:

strings由sliceOne切片而來(lái),切出來(lái)的片上數(shù)據(jù)有的是0到1,有一個(gè)元素,故其對(duì)應(yīng)的長(zhǎng)度是1。

因?yàn)榍衅且粋€(gè)引用類型,只在原始切片上切出了0到1的位置,剩余的空位還有1,故其容量等于長(zhǎng)度加剩余元素位置數(shù)。

3. 切片擴(kuò)容及slice panic: runtime error: index out of range

slice越界代碼實(shí)例如下:

    sliceOne := []string{"a", "b"}
    //使用make函數(shù)創(chuàng)造slice
    s := sliceOne[2]
    fmt.Printf(s)

使用sliceOne[2]語(yǔ)句時(shí),數(shù)組越界報(bào)錯(cuò)。

實(shí)際開發(fā)過程中,總會(huì)有slice容量不夠用的時(shí)候,該怎么擴(kuò)容,如何保證安全擴(kuò)容?

go語(yǔ)言官方提供的擴(kuò)容辦法就是創(chuàng)建一個(gè)新的更大的分片,將老分片的數(shù)據(jù)內(nèi)容遷移到新的切片當(dāng)中。

代碼展示:

package main
 
import (
    "fmt"
 )
 
func main() {
    sliceOne := []string{"a", "b"}
    fmt.Printf("切片擴(kuò)容前")
    fmt.Printf("切片的長(zhǎng)度:%d\n",len(sliceOne))
    fmt.Printf("切片的容量:%d\n",cap(sliceOne))
    t := make([]string, len(sliceOne), (cap(sliceOne))*2)
    copy(t, sliceOne)
    sliceOne = t
    fmt.Printf("切片擴(kuò)容后")
    fmt.Printf("切片的長(zhǎng)度:%d\n",len(sliceOne))
    fmt.Printf("切片的容量:%d\n",cap(sliceOne))
}

結(jié)果展示:

切片的長(zhǎng)度:2
切片的容量:2
切片的長(zhǎng)度:2
切片的容量:4

從代碼結(jié)果上看出新切片的長(zhǎng)度是2,容量是4,也再次驗(yàn)證了切片的長(zhǎng)度取決于存放了多少元素,切片的容量取決于已存放的元素?cái)?shù)量加剩余位置數(shù)。

附:go 判斷數(shù)組下標(biāo)是否存在

舉例

現(xiàn)在需要判斷命令行是否傳了參數(shù),即 os.Args[1] 是否存在

如果使用下述的判斷:

func main() {
    fmt.Println(os.Args[1])
}

會(huì)報(bào)錯(cuò):index out of range

panic: runtime error: index out of range [1] with length 1
 
goroutine 1 [running]:
main.main()
        D:/go_work/test/test4.go:9 +0xbc
exit status 2

現(xiàn)有兩種方式解決:

第一種:

通過遍歷的方式判斷 key 是否存在

func main() {
    var result string
    for k, v := range os.Args {
        if k == 1 {
            result = v
        }
    }
    if result != "" {
        fmt.Printf("os.Args[1] = %s", result)
    }
}

第二種:

由于數(shù)組下標(biāo)從0開始,len(arr)-1 為最后一個(gè)元素的下標(biāo),所以判斷所要查詢的 key 是否小于 len(arr) 就可以了

func main() {
    if len(os.Args)>=2 {
        fmt.Printf("os.Args[1] = %s", os.Args[1])
    }
}

總結(jié)

go語(yǔ)言中slice的應(yīng)用和使用相對(duì)來(lái)說方便快捷很多,不過也有一些小小的暗坑等待大家發(fā)現(xiàn)和整理哦~后續(xù)我會(huì)在我的博客中,繼續(xù)發(fā)布有關(guān)于go語(yǔ)言使用的tips和技巧~

到此這篇關(guān)于go語(yǔ)言中切片Slice與數(shù)組Array對(duì)比以及panic: runtime error: index out of range問題解決的文章就介紹到這了,更多相關(guān)go語(yǔ)言切片Slice和數(shù)組Array內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang動(dòng)態(tài)庫(kù)(so)生成與使用方法教程

    golang動(dòng)態(tài)庫(kù)(so)生成與使用方法教程

    這篇文章主要給大家介紹了關(guān)于golang動(dòng)態(tài)庫(kù)(so)生成與使用的相關(guān)資料,我們平時(shí)使用的動(dòng)態(tài)庫(kù)都是由c/c++開發(fā)最后生成的.so文件,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Golang中fsnotify包監(jiān)聽文件變化的原理詳解

    Golang中fsnotify包監(jiān)聽文件變化的原理詳解

    Golang提供了一個(gè)強(qiáng)大的fsnotify包,它能夠幫助我們輕松實(shí)現(xiàn)文件系統(tǒng)的監(jiān)控,本文將深入探討fsnotify包的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • GO語(yǔ)言不固定參數(shù)函數(shù)與匿名函數(shù)的使用

    GO語(yǔ)言不固定參數(shù)函數(shù)與匿名函數(shù)的使用

    本文主要介紹了GO語(yǔ)言不固定參數(shù)函數(shù)與匿名函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 深入理解Go高級(jí)并發(fā)模式編寫更高效可擴(kuò)展的應(yīng)用程序

    深入理解Go高級(jí)并發(fā)模式編寫更高效可擴(kuò)展的應(yīng)用程序

    Go對(duì)并發(fā)提供了強(qiáng)大的原生支持,本文討論Go的高級(jí)并發(fā)模式,理解這些并發(fā)模式,可以幫助我們編寫高效的Go應(yīng)用程序,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • golang根據(jù)生日計(jì)算星座和屬相實(shí)例

    golang根據(jù)生日計(jì)算星座和屬相實(shí)例

    這篇文章主要為大家介紹了golang根據(jù)生日計(jì)算星座和屬相的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go中defer使用場(chǎng)景及注意事項(xiàng)

    Go中defer使用場(chǎng)景及注意事項(xiàng)

    defer 會(huì)在當(dāng)前函數(shù)返回前執(zhí)行傳入的函數(shù),它會(huì)經(jīng)常被用于關(guān)閉文件描述符、關(guān)閉數(shù)據(jù)庫(kù)連接以及解鎖資源。這篇文章主要介紹了Go中defer使用注意事項(xiàng),需要的朋友可以參考下
    2021-12-12
  • 使用Go語(yǔ)言寫一個(gè)Http?Server的實(shí)現(xiàn)

    使用Go語(yǔ)言寫一個(gè)Http?Server的實(shí)現(xiàn)

    本文主要介紹了使用Go語(yǔ)言寫一個(gè)Http?Server的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 關(guān)于go-micro與其它gRPC框架之間的通信問題及解決方法

    關(guān)于go-micro與其它gRPC框架之間的通信問題及解決方法

    在之前的文章中分別介紹了使用gRPC官方插件和go-micro插件開發(fā)gRPC應(yīng)用程序的方式,都能正常走通。不過當(dāng)兩者混合使用的時(shí)候,互相訪問就成了問題,下面通過本文給大家講解下go-micro與gRPC框架通信問題,一起看看吧
    2022-04-04
  • Go基礎(chǔ)Slice教程詳解

    Go基礎(chǔ)Slice教程詳解

    這篇文章主要介紹了Go基礎(chǔ)Slice教程詳解,需要的朋友可以參考下
    2018-02-02
  • golang開啟mod后import報(bào)紅的簡(jiǎn)單解決方案

    golang開啟mod后import報(bào)紅的簡(jiǎn)單解決方案

    這篇文章主要給大家介紹了關(guān)于golang開啟mod后import報(bào)紅的簡(jiǎn)單解決方案,文中通過圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

白河县| 凌源市| 青海省| 枣强县| 千阳县| 曲沃县| 南丰县| 眉山市| 银川市| 白山市| 绩溪县| 双峰县| 孟州市| 武义县| 汝南县| 丰顺县| 红原县| 元谋县| 洛隆县| 工布江达县| 开原市| 沁源县| 楚雄市| 伊春市| 兴仁县| 青田县| 璧山县| 开原市| 台湾省| 武城县| 三江| 龙游县| 宣汉县| 阜城县| 微山县| 天峻县| 维西| 循化| 阿尔山市| 洪雅县| 喜德县|