[Go]配列とスライス
アレイとスライス
ArrayList
に類似する配列ベースのより柔軟なデータ構造である.arr1 := [...]int{1, 2, 3} // 배열
arr2 := [3]int{1, 2, 3} // 배열
slice1 := []int{1, 2, 3} // 슬라이스
slice2 := make([]int, len(arr1)) // 슬라이스
整列
There are major differences between the ways arrays work in Go and C. In Go,
スライス
배열 포인터
、길이
、용량
の3つのフィールドからなる構造体である.cap
のサイズのアレイであり、アレイが複製のために移動すると、スライスは別のアレイを指します.append
nums := make([]int, 3, 5)
nums = append(nums, 1)
copy
src := []int{1, 2, 3}
dst := src
dst
は、src
Slice自体のアドレス値のみをコピーします.src
変更されると、dst
も変更されます.src := []int{1, 2, 3}
if n := copy(dest, src); n != len(src) {
fmt.Println("복사가 덜 됐습니다.")
}
len(src)
およびlen(dst)
は、小さい値のみをコピーします.// 1번
src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src)
// 2번
src := []int{1, 2, 3}
var dst []int
dst := append(dst, src...)
insert
func Example_sliceInsert1() {
a := []int{0, 1, 2, 3, 4}
var res []int
n := 2
if n <= len(a) {
res = append(a[:n+1], a[n:]...)
res[n] = 100
} else {
res = append(a, 100)
}
fmt.Println(res)
// Output:
// [0 1 100 2 3 4]
}
func Example_sliceInsert2() {
a := []int{0, 1, 2, 3, 4}
n := 2
a = append(a, 1)
copy(a[n+1:], a[n:])
a[n] = 100
fmt.Println(a)
// Output:
// [0 1 100 2 3 4]
}
delete
順序が変更できない場合、O(N)
func Example_sliceDelete1() {
a := []int{0, 1, 2, 3, 4}
n := 2
a = append(a[:n], a[n+1:]...)
fmt.Println(a)
// Output:
// [0 1 3 4]
}
func Example_sliceDelete2() {
a := []int{0, 1, 2, 3, 4}
n := 2
k := 2 // 연속된 k개의 원소 삭제
a = append(a[:n], a[n+k:]...)
fmt.Println(a)
// Output:
// [0 1 4]
}
シーケンス可変時O(1)
func Example_sliceDelete3() {
a := []int{0, 1, 2, 3, 4}
n := 2
a[n] = a[len(a)-1]
a = a[:len(a)-1]
fmt.Println(a)
// Output:
// [0 1 4 3]
}
func Example_sliceDelete4() { // 이 경우 O(N)
a := []int{0, 1, 2, 3, 4}
n := 1
k := 4
split := len(a)-k
if n+k > split {
split = n+k
}
copy(a[n:n+k], a[split:])
a = a[:len(a)-k]
fmt.Println(a)
// Output:
// [0]
}
削除時のメモリリーク
削除したターゲットシートの内部にポインタがある場合、メモリリークが発生します.
スライスをカットしても、使用するアレイ(メモリ)は元のままで、GCターゲットにありません.このとき,配列要素がポインタであれば,そのポインタが指すオブジェクトも有効と考えられ,メモリ空間を占有しGCを行わないため,漏水が発生する.
したがって、
nil
を使用して消去する必要があります.copy(a[i:], a[i+k:])
for i := 0; i < k; i++ {
a[len(a)-1-i] = nil
}
a = a[:len(a)-k]
Reference
この問題について([Go]配列とスライス), 我々は、より多くの情報をここで見つけました https://velog.io/@jwkim/discovery-go-03テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol