溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Slice的使用注意事項有哪些

發布時間:2021-10-15 10:31:46 來源:億速云 閱讀:197 作者:iii 欄目:編程語言

本篇內容介紹了“Slice的使用注意事項有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!                      

slice在Go中的使用,一起看看下面這段程序

package mainimport (
    "fmt"
    )func main() {
    var array [10]int
    var slice = array[5:6]
    fmt.Println("lenth of slice: ", len(slice))
    fmt.Println("capacity of slice: ", cap(slice))
    fmt.Println(&slice[0] == &array[5])}
  • 這段程序我想說的是:main函數中定義了一個10個長度的整型數組array,然后定義了一個切片slice,切取數組的第6個元 素,最后打印slice的長度和容量,判斷切片的第一個元素和數組的第6個元素地址是否相等。

  • 大家想想切片的第一個元素和數組的第6個元素相等嗎,或許可以跑跑這段程序證明一下在往下面看結果,好了我也不賣關子啦,上面程序中slice跟據數組array創建,與數組共享存儲空間,slice起始位置是array[5],長度為1,容量為5, slice[0]和array[5]地址相同。

接下來大家看看這段程序,試著自己跑一下程序,動手實踐是最好的老師

package mainimport (
    "fmt")func AddElement(slice []int, e int) []int {
    return append(slice, e)
    }func main() {
    var slice []int
    slice = append(slice, 1, 2, 3)
    newSlice := AddElement(slice, 4)
    fmt.Println(&slice[0] == &newSlice[0])}
  • 上面這段我想表達的是函數AddElement()接受一個切片和一個元素,把元素append進切片中,并返回切片。main()函數中定 義一個切片,并向切片中append 3個元素,接著調用AddElement()繼續向切片append進第4個元素同時定義一個 新的切片newSlice。最后判斷新切片newSlice與舊切片slice是否共用一塊存儲空間

  • 這段程序相信很多小伙伴都覺得append會有可能觸發舊Slice的擴容,又不敢特別肯定吧,接著往下看”有可能”變為”肯定”啦:
     1.append函數執行時會判斷切片容量是否能夠存放新增元素,如果不能,則會重新申請存儲空間,新存儲空間將是原來的2倍或1.25倍(取決于擴展原空間大?。?本例中實際執行了兩次append操作,第一次空間增長到4,所以第二次append不會再擴容,所以新舊兩個切片將共用一塊存儲空間。程序會輸出”true”。

接著往下繼續看這段程序會怎樣輸出,可以思考一下或者跑跑程序:

 package mainimport (
    "fmt")func main() {
    orderLen := 5
    order := make([]uint16, 2 * orderLen)
    pollorder := order[:orderLen:orderLen]
    lockorder := order[orderLen:][:orderLen:orderLen]
    fmt.Println("len(pollorder) = ", len(pollorder))
    fmt.Println("cap(pollorder) = ", cap(pollorder))
    fmt.Println("len(lockorder) = ", len(lockorder))
    fmt.Println("cap(lockorder) = ", cap(lockorder))}

跑完上面的程序后帶著疑問接著往下看會更好,整個人有一種豁然開朗的感覺,不信可以試試:

  1. 程序中定義一個長度為10的切片order,pollorder和lockorder分別是對order切片做了order[start,stop,max]操作生成的切片,最后程序分別打印pollorder和lockorder的容量和長度。

  2. order[start,stop,max]的意思是對order進行切片,新切片范圍是[start, stop),新切片容量是max。order長度為2倍的orderLen,pollorder切片指的是order的前半部分切片,lockorder指的是order的后半部分切片,即原order分成了兩段。所以,pollorder和lockerorder的長度和容量都是orderLen,即5。

“Slice的使用注意事項有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女