切片宣告 切片在記憶體中的組織方式 reslice

2022-06-08 08:33:12 字數 2800 閱讀 4684

陣列是具有相同 唯一型別 的一組已編號且長度固定的資料項序列(這是一種同構的資料結構),[5]int和[10]int是屬於不同型別的。陣列的編譯時值初始化是按照陣列順序完成的(如下)。

切片宣告方式,

宣告切片的格式是:var identifier type(不需要說明長度)。

乙個切片在未初始化之前預設為 nil,長度為 0。

切片的初始化格式是:var slice1 type = arr1[start:end]

乙個由數字 1、2、3 組成的切片可以這麼生成:s := [3]int[:](注: 應先用s := [3]int生成陣列, 再使用s[:]轉成切片) 甚至更簡單的s := int

go 切片:用法和本質 - go 語言部落格

可能的「陷阱」

正如前面所說,切片操作並不會複製底層的陣列。整個陣列將被儲存在記憶體中,直到它不再被引用。 有時候可能會因為乙個小的記憶體引用導致儲存所有的資料。

例如,finddigits函式載入整個檔案到記憶體,然後搜尋第乙個連續的數字,最後結果以切片方式返回。

var digitregexp = regexp.mustcompile("[0-9]+")

func finddigits(filename string) byte

這段**的行為和描述類似,返回的byte指向儲存整個檔案的陣列。因為切片引用了原始的陣列, 導致 gc 不能釋放陣列的空間;只用到少數幾個位元組卻導致整個檔案的內容都一直儲存在記憶體裡。

要修復整個問題,可以將感興趣的資料複製到乙個新的切片中:

func copydigits(filename string) byte

package main

import (

"fmt"

"reflect"

)func main()

func(arr [3]int) (x)

fmt.println(x)

y := [3]int

func(arr *[3]int) (&y)

fmt.println(y)

z := int

func(arr int) (z)

fmt.println(z)

fmt.println("reflect.typeof(x,y,z:", reflect.typeof(x), reflect.typeof(y), reflect.typeof(z))

}

1、陣列,值型別

2、陣列位址,修改了陣列

3、切片,引用型別,修改了陣列

你真的懂 golang reslice 嗎 | hhf技術部落格

分片擷取也叫reslice

如果你知道這些, 那麼 slice 的使用基本上不會出現問題.

下面這些問題你考慮過嗎 ?

a1, a2 是如何共享底層陣列的?

a1[low:high]是如何實現的?

繼續來看這段**的彙編:

123

4567

891011

1213

1415

1617

18

"".a stext size=117 args=0x18 locals=0x18

// 省略...

0x0028 00040 (main.go:4) call runtime.newobject(sb)

0x002d 00045 (main.go:4) movq 8(sp), ax

0x0032 00050 (main.go:4) movq $3, (ax)

0x0039 00057 (main.go:4) movq $4, 8(ax)

0x0041 00065 (main.go:4) movq $5, 16(ax)

0x0049 00073 (main.go:4) movq $6, 24(ax)

0x0051 00081 (main.go:4) movq $7, 32(ax)

0x0059 00089 (main.go:4) movq $8, 40(ax)

0x0061 00097 (main.go:5) addq $16, ax

0x0065 00101 (main.go:6) movq ax, "".~r0+32(sp)

0x006a 00106 (main.go:6) movq $4, "".~r0+40(sp)

0x0073 00115 (main.go:6) movq $4, "".~r0+48(sp)

0x007c 00124 (main.go:6) movq 16(sp), bp

0x0081 00129 (main.go:6) addq $24, sp

0x0085 00133 (main.go:6)

Numpy中的不同方式的切片索引

陣列的切片 布林索引 ps 在這裡我將離散地選取單個或多個元素的操作歸納在索引的內容裡面,而將連續的選取一系列元素放在切面的內容裡 numpy中的基本索引與python類似,對於一維或多維陣列,可以直接基於0 n的下標進行索引。import numpy as np 一維陣列的索引 arr np.ar...

float,double在記憶體中的儲存方式

將17.625換算成 float型。首先,將17.625換算成二進位制位 10001.101 0.625 0.5 0.125,0.5即 1 2,0.125即 1 8 如果不會將小數部分轉換成二進位制,請參考其他書籍。再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x...

資料在記憶體中的儲存方式

之前在面試的時候有遇到乙個面試題 記憶體中的顯示 輸入出其實這就是little endian 小端序列 的儲存形式 比方說我有乙個0xa5b1的乙個資料。如果當前的機器是小端序列那麼在 記憶體中高位位址 存放的就是a5 example 0x40000001 記憶體中低位位址 存放的就是b1 exam...