1. 程式人生 > >go語言,切片研究,容量,長度,複製,追加

go語言,切片研究,容量,長度,複製,追加

今天學習了陣列和切片,感覺陣列不夠靈活,一旦建立,無法新增成員。但是切片就靈活多了,感覺切片存在兩種形態,第一種是對映陣列來的,那麼陣列資料變化後,切片資料也變化,h j為對映切片 ,第二 種是獨立切片,切片獨立建立,並不依賴於任何陣列, x y z均為獨立切片,z拷貝自y,當y資料改變時,z不受影響。

另外發現個有趣的事,就是切片容量 len,x剛建立時,容量是10,長度是10,增加一個成員後,容量變成20,長度變成11,說明append函式,在增加成員的時候,會大幅度增加容量,但是再看y,它採用迴圈增加成員的方式建立,建立完成後,長度是10,容量是16。

程式碼:

varar=[10]byte{'a'
,'b','c','d','e','f','g','h','i','j'}
varh,j[]byte
h=ar[2:5]
j=ar[0:8]
ar[2]='q'
fmt.Println(string(h))
fmt.Println(string(j))
fmt.Printf("j容量%s\n",cap(j))
fmt.Printf("j長度%s\n",len(j))
x:=[]int{0,1,2,3,4,5,6,7,8,9}
fmt.Println(x)
fmt.Printf("x容量%s\n",cap(x))
fmt.Printf("x長度%s\n",len(x))
x=append(x,11
)
fmt.Println(x)
fmt.Printf("x容量%s\n",cap(x))
fmt.Printf("x長度%s\n",len(x))
vary[]int
foru:=0;u<10;u++{
//y=append(y,fmt.Sprintf("%v",u))
y=append(y,u)
}
fmt.Println(y)
fmt.Printf("y容量%s\n",cap(y))
fmt.Printf("y長度%s\n",len(y))
y=append(y,5)
fmt.Println(y)
varz=make([]int,len(y))
copy(z,y)
fmt.Println(
z)
y[0]=9
fmt.Println(y)
fmt.Println(z)
結果

qde

abqdefgh

j容量%!s(int=10)

j長度%!s(int=8)

[0 1 2 3 4 5 6 7 8 9]

x容量%!s(int=10)

x長度%!s(int=10)

[0 1 2 3 4 5 6 7 8 9 11]

x容量%!s(int=20)

x長度%!s(int=11)

[0 1 2 3 4 5 6 7 8 9]

y容量%!s(int=16)

y長度%!s(int=10)

[0 1 2 3 4 5 6 7 8 9 5]

[0 1 2 3 4 5 6 7 8 9 5]

[9 1 2 3 4 5 6 7 8 9 5]

[0 1 2 3 4 5 6 7 8 9 5]


後來我再給y加入個成員,他的容量還是16,為了弄清容量和長度的關係,我寫個迴圈看看。

foru:=0;u<20;u++{
//y=append(y,fmt.Sprintf("%v",u))
y=append(y,u)
fmt.Printf("y長度%s\n",len(y))
fmt.Printf("y容量%s\n",cap(y))
}
結果是

y長度%!s(int=1)

y容量%!s(int=2)

y長度%!s(int=2)

y容量%!s(int=2)

y長度%!s(int=3)

y容量%!s(int=4)

y長度%!s(int=4)

y容量%!s(int=4)

y長度%!s(int=5)

y容量%!s(int=8)

y長度%!s(int=6)

y容量%!s(int=8)

y長度%!s(int=7)

y容量%!s(int=8)

y長度%!s(int=8)

y容量%!s(int=8)

y長度%!s(int=9)

y容量%!s(int=16)

y長度%!s(int=10)

y容量%!s(int=16)

y長度%!s(int=11)

y容量%!s(int=16)

y長度%!s(int=12)

y容量%!s(int=16)

y長度%!s(int=13)

y容量%!s(int=16)

y長度%!s(int=14)

y容量%!s(int=16)

y長度%!s(int=15)

y容量%!s(int=16)

y長度%!s(int=16)

y容量%!s(int=16)

y長度%!s(int=17)

y容量%!s(int=32)

y長度%!s(int=18)

y容量%!s(int=32)

y長度%!s(int=19)

y容量%!s(int=32)

y長度%!s(int=20)

y容量%!s(int=32)

呵呵 ,這下明白了,新增成員時,容量是2的指數遞增的,2,4,8,16,32。而且是在長度要超過容量時,才增加容量。

我想在以後的開發中,切片我一定會比陣列用的多,因為在原來的專案裡,幾乎所有陣列都是無法提前知道它的長度的,都是會隨時增加成員的。

相關推薦

go語言切片研究容量長度複製追加

今天學習了陣列和切片,感覺陣列不夠靈活,一旦建立,無法新增成員。但是切片就靈活多了,感覺切片存在兩種形態,第一種是對映陣列來的,那麼陣列資料變化後,切片資料也變化,h j為對映切片 ,第二 種是獨立切片,切片獨立建立,並不依賴於任何陣列, x y z均為獨立切片,z拷貝自y

go語言筆記——切片函數常見操作增刪改查和搜索、排序

通過 學習 strings 完整 官方文檔 二分 func fun 必須 7.6.6 搜索及排序切片和數組 標準庫提供了 sort 包來實現常見的搜索和排序操作。您可以使用 sort 包中的函數 func Ints(a []int) 來實現對 int 類型的切片排序。例如

Go語言切片作為函式引數函式中使用append新增元素

切片作為函式,通過append新增元素,有可能會更改地址: 1)新增的資料元素長度超過切片引數的容量,則會另開闢空間,重新分配底層陣列,並複製資料。函式中的此切片與原切片地          址不同; 此切片指向新開闢的記憶體。函式執行結束,記憶體釋放,不會影響元切片的內容。

Go語言切片

可選 默認 代碼 slice ont [] 追加 pac 通過 Go 語言切片(Slice) Go 語言切片是對數組的抽象。 Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組"),與數組相比切片的長度是不固

Go語言切片Slice練習

切片slice切片Slice理論知識 其本身並不是數組,它指向底層的數組 作為編程數組的替代方案,可以關聯底層數組的局部或者全部 為引用類型 可以直接創建或從底層數組獲取生成 使用len()獲取元素個數,cap()獲取容量 一般使用make()創建 如果多個slice指向相同底層數組,其中一個的值改變會影響

Go語言切片和map

package pri code [] print UNC AR make 運行 實例 package main import ( "fmt" ) func main() { arr := make([]i

Go語言切片的使用

1 概述 其中切片是基於資料中連續片段的引用,是一個引用型別。與陣列不同的是,切片的長度可以在執行時修改。使用上可以將切片看作是長度可變的陣列。即使超過了底層陣列的最大長度,也可以繼續擴容。 圖例為: 切片的實現是由一個底層陣列以及其上面的動態位置,尺寸來實

Go 語言切片與記憶體複製 memcpy 的實現方法

Go 語言原則上不支援記憶體的直接操作訪問,但是提供了切片功能。最初我以為切片就是動態陣列,實際程式設計過程中發現,切片是提供陣列一個記憶體片段的一個合法的手段,利用切片功能,實際上我們可以自由訪問陣列的任何一個片段,因而可以藉助 copy 函式,實現記憶體複製

Go語言基礎(十四)—— Go語言切片map結構體與Json的序列化反序列化

序列化和反序列化 序列化概念理解:就是將變數從記憶體中變成可儲存或傳輸的過程稱之為序列化,序列化之後,就可以把序列化後的內容寫入磁碟,或者通過網路傳輸到別的機器上。 反序列化則就是序列化反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化 序列化結構體案例: packa

初識go語言之 陣列與切片(建立遍歷刪除插入複製

1、陣列 go語言的陣列與其他語言的資料定義基本類似:大小確定,記憶體連續,可以隨機訪問。陣列的元素使用操作符[]來索引。首元素是array[0],最後一個元素是array[len(array)-1]。 1.1陣列的建立 陣列的建立有下面三種方式 [length]T

GO語言學習(三):指標切片map對映

1.指標 func main() { var a int = 10 //每個變數有2層含義,變數的記憶體,變數的地址 fmt.Printf("a =%d\n", a) fmt.Printf("&a =%v\n", &a) //儲存

go語言筆記——append是內置的函數!!!new是一個函數!!!調試可以使用閉包本質上是print調試尼瑪!

... -c map blob 名稱 ebo bsp 處理機制 它的 內置函數 Go 語言擁有一些不需要進行導入操作就可以使用的內置函數。它們有時可以針對不同的類型進行操作,例如:len、cap 和 append,或必須用於系統級的操作,例如:panic。因此,它們需要直接

go語言筆記——map map 默認是無序的不管是按照 key 還是按照 value 默認都不排序

pcr 錯誤 固定 pre text 輸出結果 示例 operation frequency 示例 8.1 make_maps.go package main import "fmt" func main() { var mapLit map[string]int

go語言使用go-sciter創建桌面應用(二) ui元素查找增加刪除修改

.get 添加 select false 方法 count() 桌面應用 css選擇器 html 我們可以通過go-sciter給我們提供的方法,方便的對html,css編寫的UI界面進行增刪改查。 demo3.go代碼如下: package main; im

go語言使用go-sciter創建桌面應用(七) view對象常用方法文件選擇窗口彈出請求

問題 adf img function jquery stdout view type 改變 view對象的詳細文檔請看: https://sciter.com/docs/content/sciter/View.htm demo9.html代碼如下: &l

Go語言互斥鎖使用

class creat brush true tin clas pre unlock defer package main import ( "fmt" "runtime" "sync" ) var ( counter int wg s

Go語言練習之方法接口並發

response sprint div hat and ade quest runtime nan 多練練,有感覺了就寫實際的東東。 package main import ( "fmt" "math" "os" "time" "net/ht

Go語言的GUI方案與Qt和QML都能綁定也有從頭寫的gxui

tool ins 感覺 for wid called 路徑 linu 適合 半官方:https://godoc.org/golang.org/x/exp/shiny 作者:王益鏈接:https://www.zhihu.com/question/22483719/answe

Go語言的網絡功能太強了這麽多項目。。。

etc rpc服務 框架 file olt 配置 lan 實現 dubbo Centrifugo 是一個用 Golang 實現的基於 Websocket 或者 SockJS 的實時通信平臺。https://www.oschina.net/p/centrifugalrpcx是

go語言的ifswichfor的三種寫法

imp port 寫法 數字 == 其中 條件語句 pre 條件 一 Go語言的For循環有3種形式,只有其中的一種使用分號。 package main inport(   "fmt" ) fnnc main(){   for i:=0;i<5;i++{