最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中Append()使用實例詳解

 更新時間:2023年01月12日 10:45:44   作者:死美子  
今天在刷leetcode的時候,第113題讓我遇到了一個Go語言中append函數(shù)的一個坑,所以復(fù)習(xí)下,這篇文章主要給大家介紹了關(guān)于Golang中Append()使用的相關(guān)資料,需要的朋友可以參考下

append函數(shù)的使用:

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()函數(shù)會創(chuàng)建一個新的slice,它與old slice共享底層內(nèi)存

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

用old slice給new slice進行賦值的方式進行創(chuàng)建,會共享內(nèi)存。并返回這個new slice。

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

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

實例:appendInt()

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

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

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

	// 判斷 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) //創(chuàng)建為原來的兩倍
		}
		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區(qū)別

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

copy(new, old) 函數(shù)copy只會將slice內(nèi)容進行拷貝。

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

總結(jié)

到此這篇關(guān)于Golang中Append()使用的文章就介紹到這了,更多相關(guān)Golang Append()詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Golang小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入

    Golang小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入

    這篇文章主要給大家介紹了關(guān)于Golang小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • Go語言應(yīng)用閉包之返回函數(shù)

    Go語言應(yīng)用閉包之返回函數(shù)

    這篇文章主要介紹了Go語言應(yīng)用閉包之返回函數(shù),對于非常底層的純 Go 語言代碼或者包而言,在各個操作系統(tǒng)平臺上的可移植性是非常強的,只需要將源碼拷貝到相應(yīng)平臺上進行編譯即可,或者可以使用交叉編譯來構(gòu)建目標(biāo)平臺的應(yīng)用程序,需要的朋友可以參考下
    2023-07-07
  • Go語言定時器Timer和Ticker的使用與區(qū)別

    Go語言定時器Timer和Ticker的使用與區(qū)別

    在Go語言中內(nèi)置的有兩個定時器,Timer和Ticker,本文主要介紹了Go語言定時器Timer和Ticker的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 詳解Golang中的交叉編譯

    詳解Golang中的交叉編譯

    在 Golang 中,交叉編譯指的是在同一臺機器上生成針對不同操作系統(tǒng)或硬件架構(gòu)的二進制文件,這在開發(fā)跨平臺應(yīng)用或構(gòu)建特定平臺的發(fā)布版本時非常有用,本文就詳細(xì)的給大家介紹一下Golang中的交叉編譯,需要的朋友可以參考下
    2023-08-08
  • Go語言題解LeetCode1260二維網(wǎng)格遷移示例詳解

    Go語言題解LeetCode1260二維網(wǎng)格遷移示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode1260二維網(wǎng)格遷移示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Goland字符串格式化樣式中“\r“的作用詳解

    Goland字符串格式化樣式中“\r“的作用詳解

    這篇文章主要介紹了Goland字符串格式化樣式中“\r“的作用,"\r"起的作用是回到行首,當(dāng)前控制臺輸出,輸出完以后回到當(dāng)前行的行首,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • go格式“占位符”輸入輸出 類似python的input

    go格式“占位符”輸入輸出 類似python的input

    這篇文章主要介紹了go格式“占位符”, 輸入輸出,類似python的input,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 詳解Go語言Slice作為函數(shù)參數(shù)的使用

    詳解Go語言Slice作為函數(shù)參數(shù)的使用

    Slice切片在Go語言中實質(zhì)是一種結(jié)構(gòu)體類型,本文詳細(xì)的介紹了Go語言Slice作為函數(shù)參數(shù)的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    這篇文章主要介紹了Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的的場景復(fù)現(xiàn)和解決辦法,文中通過代碼示例講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 使用Go實現(xiàn)在命令行輸出好看的表格

    使用Go實現(xiàn)在命令行輸出好看的表格

    這篇文章主要介紹了使用Go實現(xiàn)在命令行輸出好看的表格方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

阳谷县| 商城县| 梁河县| 石阡县| 瓮安县| 惠安县| 南投县| 罗山县| 金昌市| 漳平市| 江北区| 泗洪县| 水城县| 合水县| 嘉峪关市| 古蔺县| 江永县| 富平县| 商洛市| 定襄县| 沈阳市| 普陀区| 嘉鱼县| 全南县| 巴彦县| 吉木萨尔县| 江源县| 乐清市| 秀山| 连州市| 兰考县| 湟中县| 桂平市| 菏泽市| 临漳县| 延庆县| 平顶山市| 富锦市| 衡阳市| 隆昌县| 方山县|