關於go切片的理解

2022-09-04 23:45:25 字數 808 閱讀 9605

package main

import "fmt"

func main() // arr 是乙個陣列

s1 := arr[:]

// 陣列是連續儲存的空間 切片只存放指標 沒有存放資料 所以 指標的位置

// 只收上界影響,也就是資料的基址, 他的操作範圍 只能從指標開始到連續的記憶體結束 如果超過容量 擴容後

// 就產生了新的陣列和記憶體空間 切片的指標也會指向新的記憶體

fmt.println(&s1[0])

fmt.println(&arr[0]) //列印基址(也就是第乙個元素的位址),結果是一樣的,因為都共用同乙份記憶體資料。空切片的位址是0x0

s1 = s1[:1]

fmt.println(&s1[0])

fmt.println(&arr[0]) //修改s1的len,列印基址,結果是一樣的,因為都共用同乙份記憶體資料,且基址是同乙個元素位址。

s1 = s1[:2]

fmt.println(s1)//增加s1的len,可以列印出 ,說明切片的資料是基於arr陣列,本身不儲存資料,取決於當前指標的位置,

// 以及指標之後的,對應的arr陣列的連續記憶體位址的值。

s1 = s1[1:3]

fmt.println(&s1[0]) //左界右移1,長度2,容量5,基址變化右移1

fmt.println(s1) //對應的資料,也是從基址開始的2個元素

s1 = s1[0:5]

fmt.println(s1) //長度增加,容量5,所以,是可以列印出5個元素

}

go語言關於切片型別記憶體位址的理解

學習go語言切片型別時遇到了這樣乙個問題。首先,在go中,切片型別的變數實際上存放的是乙個位址,該位址即為其引用的底層陣列的第乙個元素的位址,也可以說是這個陣列的位址。如圖所示,建立乙個名為s的切片 var s int變數s儲存在棧區,其位址為0x000050420,而其值並不是陣列 1,2,3 而...

Go語言的切片

go 語言切片是對陣列的抽象。go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。在一定程度上可以看做乙個動態陣列 切片的方式 1.var identifier...

go陣列 切片

陣列 陣列指標 fmt.println 陣列指標 i int var p 10 int i fmt.println p fmt.println p x,y 1,2 j int fmt.println j k 2 int l 2 int fmt.println k l 指向陣列的指標 m new 5 ...