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

Golang中Append()使用實(shí)例詳解

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

append函數(shù)的使用:

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

var x []int

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

追加一個(gè)切片需要進(jìn)行解包

append()的原理

1.如果原來(lái)slice capacity足夠大的情況下,append()函數(shù)會(huì)創(chuàng)建一個(gè)新的slice,它與old slice共享底層內(nèi)存

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

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

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

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

實(shí)例:appendInt()

這個(gè)是只能追加一個(gè)元素的例子

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

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

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

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

	return z
}

測(cè)試:

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ū)別

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

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

	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]

補(bǔ)充知識(shí):golang append 小技巧

package main

import (
	"fmt"
)

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

    詳解Golang中的交叉編譯

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

平遥县| 罗城| 宁夏| 鲁甸县| 新密市| 宣汉县| 乌鲁木齐市| 奇台县| 高淳县| 武宁县| 大埔县| 浦北县| 南溪县| 象州县| 安化县| 郯城县| 长治市| 方正县| 淮安市| 马鞍山市| 汉源县| 湖北省| 油尖旺区| 榆林市| 轮台县| 庆城县| 惠水县| 象州县| 肇州县| 大庆市| 华坪县| 铜鼓县| 翁牛特旗| 蓝田县| 江津市| 乌拉特中旗| 突泉县| 阳江市| 台南县| 万宁市| 博客|