本文由go語言教程欄目給大家分享go中關(guān)于Slice的使用注意事項(xiàng),希望對需要的朋友有所幫助!
這篇文章跟大家探討一下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函數(shù)中定義了一個10個長度的整型數(shù)組array,然后定義了一個切片slice,切取數(shù)組的第6個元 素,最后打印slice的長度和容量,判斷切片的第一個元素和數(shù)組的第6個元素地址是否相等。
- 大家想想切片的第一個元素和數(shù)組的第6個元素相等嗎,或許可以跑跑這段程序證明一下在往下面看結(jié)果,好了我也不賣關(guān)子啦,上面程序中slice跟據(jù)數(shù)組array創(chuàng)建,與數(shù)組共享存儲空間,slice起始位置是array[5],長度為1,容量為5, slice[0]和array[5]地址相同。
接下來大家看看這段程序,試著自己跑一下程序,動手實(shí)踐是最好的老師
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])}
- 上面這段我想表達(dá)的是函數(shù)AddElement()接受一個切片和一個元素,把元素append進(jìn)切片中,并返回切片。main()函數(shù)中定 義一個切片,并向切片中append 3個元素,接著調(diào)用AddElement()繼續(xù)向切片append進(jìn)第4個元素同時(shí)定義一個 新的切片newSlice。最后判斷新切片newSlice與舊切片slice是否共用一塊存儲空間
- 這段程序相信很多小伙伴都覺得append會有可能觸發(fā)舊Slice的擴(kuò)容,又不敢特別肯定吧,接著往下看”有可能”變?yōu)椤笨隙ā崩?
1.append函數(shù)執(zhí)行時(shí)會判斷切片容量是否能夠存放新增元素,如果不能,則會重新申請存儲空間,新存儲空間將是原來的2倍或1.25倍(取決于擴(kuò)展原空間大?。?本例中實(shí)際執(zhí)行了兩次append操作,第一次空間增長到4,所以第二次append不會再擴(kuò)容,所以新舊兩個切片將共用一塊存儲空間。程序會輸出”true”。
接著往下繼續(xù)看這段程序會怎樣輸出,可以思考一下或者跑跑程序:
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))}
跑完上面的程序后帶著疑問接著往下看會更好,整個人有一種豁然開朗的感覺,不信可以試試:
- 程序中定義一個長度為10的切片order,pollorder和lockorder分別是對order切片做了order[start,stop,max]操作生成的切片,最后程序分別打印pollorder和lockorder的容量和長度。
- order[start,stop,max]的意思是對order進(jìn)行切片,新切片范圍是[start, stop),新切片容量是max。order長度為2倍的orderLen,pollorder切片指的是order的前半部分切片,lockorder指的是order的后半部分切片,即原order分成了兩段。所以,pollorder和lockerorder的長度和容量都是orderLen,即5。
這篇文章對Slice的一些使用講解就在這里了,希望幫到有需要的伙伴吧,