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

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

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

前言

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

一、go slice是什么

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

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

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

slice的創(chuàng)建有兩個方法分別是使用字面量定義和使用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的長度和容量概念理解

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

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

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

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

容量:slice切片的長度能夠到達的最大值
英文:Slice: the maximum length the slice can reach when resliced;

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

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

代碼結(jié)果輸出:

切片的長度:1
切片的容量:2

代碼原理解析:

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

因為切片是一個引用類型,只在原始切片上切出了0到1的位置,剩余的空位還有1,故其容量等于長度加剩余元素位置數(shù)。

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

slice越界代碼實例如下:

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

使用sliceOne[2]語句時,數(shù)組越界報錯。

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

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

代碼展示:

package main
 
import (
    "fmt"
 )
 
func main() {
    sliceOne := []string{"a", "b"}
    fmt.Printf("切片擴容前")
    fmt.Printf("切片的長度:%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("切片擴容后")
    fmt.Printf("切片的長度:%d\n",len(sliceOne))
    fmt.Printf("切片的容量:%d\n",cap(sliceOne))
}

結(jié)果展示:

切片的長度:2
切片的容量:2
切片的長度:2
切片的容量:4

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

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

舉例

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

如果使用下述的判斷:

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

會報錯: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ù)組下標從0開始,len(arr)-1 為最后一個元素的下標,所以判斷所要查詢的 key 是否小于 len(arr) 就可以了

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

總結(jié)

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

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

相關(guān)文章

  • Go實現(xiàn)整合Logrus實現(xiàn)日志打印

    Go實現(xiàn)整合Logrus實現(xiàn)日志打印

    這篇文章主要介紹了Go實現(xiàn)整合Logrus實現(xiàn)日志打印,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 一文詳解Go中方法接收器的選擇

    一文詳解Go中方法接收器的選擇

    許多 Go 初學(xué)者在方法接收器的選擇上可能會感到困惑,不知道該選擇值接收器還是指針接收器。本文將會對方法接收器進行介紹,并給出如何選擇正確方法接收器的指導(dǎo)建議,希望對大家有所幫助
    2023-04-04
  • golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)

    golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)

    在golang中并沒有提供內(nèi)置函數(shù)來獲取變量的類型,但是通過一定的方式也可以獲取,下面這篇文章主要給大家介紹了關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式,需要的朋友可以參考下
    2022-12-12
  • Gin框架之參數(shù)綁定的實現(xiàn)

    Gin框架之參數(shù)綁定的實現(xiàn)

    為了能夠更方便的獲取請求相關(guān)參數(shù),提高開發(fā)效率,本文主要介紹了Gin框架之參數(shù)綁定的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang字符串轉(zhuǎn)64位整數(shù)的示例代碼

    golang字符串轉(zhuǎn)64位整數(shù)的示例代碼

    這篇文章主要介紹了golang字符串轉(zhuǎn)64位整數(shù),在Go語言中,可以使用strconv包中的ParseInt函數(shù)將字符串轉(zhuǎn)換為64位整數(shù),本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • 詳解Go strconv包

    詳解Go strconv包

    Go語言中strconv包實現(xiàn)了基本數(shù)據(jù)類型和其字符串表示的相互轉(zhuǎn)換。這篇文章主要介紹了Go strconv包的相關(guān)知識,需要的朋友可以參考下
    2020-10-10
  • 手把手帶你走進Go語言之類型轉(zhuǎn)換

    手把手帶你走進Go語言之類型轉(zhuǎn)換

    每個函數(shù)都可以強制將一個表達式轉(zhuǎn)換成某種特定數(shù)據(jù)類型,本文給大家介紹了在Go語言中類型轉(zhuǎn)換的具體用法,講述的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-09-09
  • Go語言編譯時為exe添加圖標和屬性信息的方法

    Go語言編譯時為exe添加圖標和屬性信息的方法

    在使用Go語言開發(fā)應(yīng)用程序時,有個非常方便的地方就是編譯得到的可執(zhí)行文件可以不依賴任何動態(tài)鏈接庫、并且不需要任何運行環(huán)境即可運行,本文給大家介紹Go編譯時為exe添加圖標和屬性信息的方法,需要的朋友可以參考下
    2023-09-09
  • golang協(xié)程與線程區(qū)別簡要介紹

    golang協(xié)程與線程區(qū)別簡要介紹

    這篇文章主要介紹了golang協(xié)程與線程區(qū)別簡要介紹,進程是操作系統(tǒng)資源分配的基本單位,是程序運行的實例,線程是操作系統(tǒng)調(diào)度到CPU中執(zhí)行的基本單位
    2022-06-06
  • golang中struct和interface的基礎(chǔ)使用教程

    golang中struct和interface的基礎(chǔ)使用教程

    Go不同于一般的面向?qū)ο笳Z言,需要我們好好的學(xué)習(xí)研究,下面這篇文章主要給大家介紹了關(guān)于golang中struct和interface的基礎(chǔ)使用的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03

最新評論