日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Golang中Append()使用實例詳解_Golang

作者:死美子 ? 更新時間: 2023-03-01 編程語言

append函數的使用:

append可以向一個slice中追加一個元素、多個元素、新的切片

var x []int

x = append(x, 1) // 追加一個元素
x = append(x,2,3,4) //追加多個元素
x = append(x, []int{5,6,7}...) //追加一個新的切片

追加一個切片需要進行解包

append()的原理

1.如果原來slice capacity足夠大的情況下,append()函數會創建一個新的slice,它與old slice共享底層內存

創建原理:newSlice = oldSlice[:1+len(x)]

用old slice給new slice進行賦值的方式進行創建,會共享內存。并返回這個new slice。

因此為了保險,我們通常將append返回的內容賦值給原來的slice: x = appen(x,…)

2.如果原來的slice沒有足夠的容量添加內容,則創建一個新的slice,這個slice是copy的old slice。不與old slice共享內存

實例:appendInt()

這個是只能追加一個元素的例子

追加之前,判斷cap(x) 是否足夠,

  • 如果足夠則創建的z 大小是 len(x) + 1
  • 如果不夠,則創建一個是原來兩倍大的z
func appendInt(x []int, y int) []int {
	var z []int        // 創建一個中間數組
	zlen := len(x) + 1 // 準備增加一個元素的位子

	// 判斷 x 的cap是否足夠容納新的元素
	if zlen <= cap(x) {
		// 容量足夠,直接將x拷貝給y
		z = x[:zlen]
		//如果容量足夠要裝一個z,比x大一個位子,因此要把x后面的空位也拷貝過去
	} else {
		// x 的容量不夠 需要擴容
		zcap := zlen // 如果xlen == 0
		if zcap < 2*len(x) {
			zcap = 2 * len(x) //創建為原來的兩倍
		}
		z = make([]int, zlen, zcap)
		copy(z, x)
	}

	z[len(x)] = y // 將y放在最后一個位子

	return z
}

測試:

func main() {
	var x, y []int
	for i := 0; i < 10; i++ {
		y = appendInt(x, i)
		fmt.Printf("%d cap=%d\t%v\n", i, cap(y), y)
		x = y
	}
}

每次容量的變化:

0 ?cap=1 ? ?[0]
1 ?cap=2 ? ?[0 1]
2 ?cap=4 ? ?[0 1 2]
3 ?cap=4 ? ?[0 1 2 3]
4 ?cap=8 ? ?[0 1 2 3 4]
5 ?cap=8 ? ?[0 1 2 3 4 5]
6 ?cap=8 ? ?[0 1 2 3 4 5 6]
7 ?cap=8 ? ?[0 1 2 3 4 5 6 7]
8 ?cap=16 ? [0 1 2 3 4 5 6 7 8]
9 ?cap=16 ? [0 1 2 3 4 5 6 7 8 9]

拷貝:賦值 copy區別

= 賦值拷貝,會將原來slice的地址拷貝,新舊slice共享內存。

copy(new, old) 函數copy只會將slice內容進行拷貝。

	var x, y []int
	x = []int{1, 2, 3, 4}
	fmt.Println(x, y) // [1 2 3 4] []
	y = x
	y[0] = 0
	fmt.Println("y 改后 : ", x, y) //[0 2 3 4] [0 2 3 4]

補充知識:golang append 小技巧

package main

import (
	"fmt"
)

func main() {
	//定義個int 數組初始化為1 2 3 4
	var test []int = []int{1, 2, 3, 4}
	//如果我想讓他的 值變成 1 2 3 4 5 6 7 可以使用append 內置函數
	/*
		append主要用于給某個切片(slice)追加元素;
		如果該切片存儲空間(cap)足夠,就直接追加,長度(len)變長;
		如果空間不足,就會重新開辟內存,并將之前的元素和新的元素一同拷貝進去;
		第一個參數為切片,后面是該切片存儲元素類型的可變參數;
	*/
	test = append(test, 5)
	test = append(test, 6)
	test = append(test, 7)
	//現在我們得到想要的結果 但是寫了3行 有一個技巧可以直接寫一行解決戰斗
	//直接追加一個 slice
	fmt.Println(test)
	//當然這個寫肯定是會報錯的。
	//cannot use []int literal (type []int) as type int in append
	//他會告訴你 正常的使用應該是int 類型而不是[]int 類型
	test = append(test, []int{5, 6, 7})
	//正確的玩法 切記記得加 3個點
	test = append(test, []int{5, 6, 7}...)
	fmt.Println(test)
}

總結

原文鏈接:https://blog.csdn.net/zyzyzyzyzyzyzyzyz/article/details/118765740

欄目分類
最近更新