国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang slice 作為參數(shù)值傳遞情況說明

這篇具有很好參考價值的文章主要介紹了golang slice 作為參數(shù)值傳遞情況說明。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

golang 中引用類型有:slice、map、interface、channel
golang所有類型在函數(shù)中都是值傳遞,這個跟上面golang中有的數(shù)據(jù)類型為引用類型并不沖突,用下面四個slice實例幫助理解

// 例子 1
func fn(s []int) {
    s[0] = 3
}

func main() {
	slice := []int{1,2}
	fmt.Printf("before fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("before fn slice data:",slice)
	fn(slice)
	fmt.Printf("after fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("after fn slice data:",slice)
}

// 輸出結(jié)果
// before fn slice len:2, cap:2, add:0xc000132b00before fn slice data: [1 2]
// after fn slice len:2, cap:2, add:0xc000132b00after fn slice data: [3 2]

說明: main 函數(shù)中slice[0]說明 fn 函數(shù)里面的修改,也改變函數(shù)外的值,這跟slice為引用類型的緣故

// 例子 2
func fn(s []int) {
    s[0] = 3
    s = append(s, 4)
    fmt.Printf("fn in slice len:%d, cap:%d, add:%p", len(s), cap(s), s)
    fmt.Println("fn in slice data:", s)
}

func main() {
	slice := []int{1,2}
	fmt.Printf("before fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("before fn slice data:",slice)
	fn(slice)
	fmt.Printf("after fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("after fn slice data:",slice)
}

// 輸出結(jié)果
// before fn slice len:2, cap:2, add:0xc000026ba0before fn slice data: [1 2]
// fn in slice len:3, cap:4, add:0xc0000244c0fn in slice data: [3 2 4]
// after fn slice len:2, cap:2, add:0xc000026ba0after fn slice data: [3 2]

說明:slice[0] 被修改原因見例1,fn中append的值沒有帶出來,這里是slice原始分配的空間為2,append導(dǎo)致空間不足,分配新地址,fn外地址不變,導(dǎo)致append的值函數(shù)外獲取不到??那就分配足夠的空間見例3

// 例子 3
func fn(s []int) {
    s[0] = 3
    s = append(s, 4)
    fmt.Printf("fn in slice len:%d, cap:%d, add:%p", len(s), cap(s), s)
    fmt.Println("fn in slice data:", s)
}

func main() {
	slice := make([]int, 0, 4)
	// slice = []int{1,2} // 直接賦值會修改slice的地址
	slice = append(slice,1,2)
	fmt.Printf("before fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("before fn slice data:",slice)
	fn(slice)
	fmt.Printf("after fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("after fn slice data:",slice)
}

// 輸出結(jié)果
// before fn slice len:2, cap:2, add:0xc000026ba0before fn slice data: [1 2]
// fn in slice len:3, cap:4, add:0xc0000244c0fn in slice data: [3 2 4]
// after fn slice len:2, cap:2, add:0xc000026ba0after fn slice data: [3 2]

說明:slice 分配了足夠的空間發(fā)現(xiàn),fn內(nèi)部append依舊沒有生效,觀察地址發(fā)現(xiàn)fn內(nèi)部的地址和函數(shù)外的地址不一致,因為fn方法參數(shù)為切片,而不是切片數(shù)組,slice 底層結(jié)構(gòu)為len、cap和指向存儲位置的地址,slice 在函數(shù)間傳遞,指向存儲位置的地址的指針是一致,但是不同函數(shù)的slice不是同一個對下個,對應(yīng)的len、cap是不一致的

// 例子 4
func fn(s *[]int) {
    (*s)[0] = 3
    *s = append(*s, 4)
}

func main() {
	slice := make([]int, 0, 4)
	// slice = []int{1,2} // 直接賦值會修改slice的地址
	slice = append(slice,1,2)
	fmt.Printf("before fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("before fn slice data:",slice)
	fn(&slice)
	fmt.Printf("after fn slice len:%d, cap:%d, add:%p", len(slice), cap(slice), slice)
	fmt.Println("after fn slice data:",slice)
}

// 輸出結(jié)果
// before fn slice len:2, cap:2, add:0xc000026b80before fn slice data: [1 2]
// after fn slice len:3, cap:4, add:0xc0000244a0after fn slice data: [3 2 4]

說明:函數(shù)間的參數(shù)傳遞改為指針,保證函數(shù)內(nèi)外完全是同一個值,故函數(shù)內(nèi)的修改和append函數(shù)外都能獲取到文章來源地址http://www.zghlxwxcb.cn/news/detail-613472.html

到了這里,關(guān)于golang slice 作為參數(shù)值傳遞情況說明的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Golang】Golang進階系列教程--Go 語言數(shù)組和切片的區(qū)別

    【Golang】Golang進階系列教程--Go 語言數(shù)組和切片的區(qū)別

    在 Go 語言中,數(shù)組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。 數(shù)組和切片是兩個常用的數(shù)據(jù)結(jié)構(gòu)。它們都可以用于存儲一組相同類型的元素,但在底層實現(xiàn)和使用方式上存在一些重要的區(qū)別。 Go 中數(shù)組的長度是不可改變的

    2024年02月15日
    瀏覽(31)
  • golang無需創(chuàng)建新切片

    在 Go 語言中,`append(b, 0)[:len(b)]` 是一種常見的用法,用于在切片 `b` 后追加一個元素,并返回舊切片的前 `len(b)` 個元素。 這種用法的目的是將一個新元素追加到切片中,并確保切片的長度保持不變。具體步驟如下: 1. `append(b, 0)`:通過 `append` 函數(shù)將元素 `0` 追加到切片 `b`

    2024年02月11日
    瀏覽(22)
  • golang字符串切片去重

    函數(shù)的功能是從輸入的字符串切片中去除重復(fù)的元素,并返回去重后的結(jié)果。具體的實現(xiàn)邏輯如下: 創(chuàng)建一個空的結(jié)果切片 result ,用于存儲去重后的字符串。 創(chuàng)建一個臨時的map tempMap ,用于存放不重復(fù)的字符串。map的鍵是字符串,值是字節(jié)類型。 遍歷輸入的字符串切片

    2024年02月12日
    瀏覽(19)
  • golang 基于數(shù)組、切片、鏈表實現(xiàn)隊列

    數(shù)組 切片 鏈表 鏈表加鎖實現(xiàn)線程安全 cas 實現(xiàn) 無鎖隊列

    2024年02月04日
    瀏覽(20)
  • 【GoLang】【工具分享】1、根據(jù) JsonTag 對 slice 進行穩(wěn)定排序(不支持嵌套)

    后端返回 List 列表中的 Json 序列化結(jié)構(gòu)到前端,其中包含許多字段,業(yè)務(wù)需求可以按照某個字段對列表數(shù)據(jù)做 升/降序排序。 前端將后端返回的 Json 及排序方向作為參數(shù)傳遞至后端即可,后端根據(jù) Json 排序找到對應(yīng)的 JsonTag 后,采用反射找到字段,再寫自定義排

    2024年02月12日
    瀏覽(18)
  • 為什么 Golang Fasthttp 選擇使用 slice 而非 map 存儲請求數(shù)據(jù)

    為什么 Golang Fasthttp 選擇使用 slice 而非 map 存儲請求數(shù)據(jù)

    Fasthttp 是一個高性能的 Golang HTTP 框架,它在設(shè)計上做了許多優(yōu)化以提高性能。其中一個顯著的設(shè)計選擇是使用 slice 而非 map 來存儲數(shù)據(jù),尤其是在處理 HTTP headers 時。 為什么呢? 本文將從簡單到復(fù)雜,逐步剖析為什么 Fasthttp 選擇使用 slice 而非 map,并通過代碼示例解釋這一

    2024年01月22日
    瀏覽(21)
  • 關(guān)于切片參數(shù)傳遞的問題

    關(guān)于切片參數(shù)傳遞的問題

    前言:在 Golang 中函數(shù)之間傳遞變量時總是以值的方式傳遞的,無論是 int,string,bool,array 這樣的內(nèi)置類型(或者說原始的類型),還是 slice,channel,map 這樣的引用類型,在函數(shù)間傳遞變量時,都是以值的方式傳遞,也就是說傳遞的都是值的副本。 在使用ioutil的ReadAll方法時查看了

    2024年02月06日
    瀏覽(15)
  • Golang教程一(環(huán)境搭建,變量,數(shù)據(jù)類型,數(shù)組切片map)

    Golang教程一(環(huán)境搭建,變量,數(shù)據(jù)類型,數(shù)組切片map)

    目錄 一、環(huán)境搭建 1.windows安裝 2.linux安裝? 3.開發(fā)工具 二、變量定義與輸入輸出 1.變量定義 2.全局變量與局部變量 3.定義多個變量 4.常量定義 5.命名規(guī)范 6.輸出 格式化輸出 7.輸入? 三、基本數(shù)據(jù)類型 1.整數(shù)型 2.浮點型 3.字符型 4.字符串類型 轉(zhuǎn)義字符 多行字符串 5.布爾類型

    2024年04月16日
    瀏覽(23)
  • Golang 卡碼網(wǎng)55 右旋字符串 切片拷貝問題補充

    右旋字符串 55卡碼網(wǎng) 關(guān)于go中切片的拷貝問題: 通過[:]的方式進行賦值的方式,如b:=a[:2],由于其共享底層的數(shù)組,所以說修改其中之一,另一個也是受影響的,為 淺拷貝 切片如果想要實現(xiàn)深拷貝,需要使用** copy **

    2024年01月22日
    瀏覽(19)
  • 【Golang】golang中http請求的context傳遞到異步任務(wù)的坑

    【Golang】golang中http請求的context傳遞到異步任務(wù)的坑

    在golang中,context.Context可以用來用來設(shè)置截止日期、同步信號,傳遞請求相關(guān)值的結(jié)構(gòu)體。 與 goroutine 有比較密切的關(guān)系。 在web程序中,每個Request都需要開啟一個goroutine做一些事情,這些goroutine又可能會開啟其他的 goroutine去訪問后端資源,比如數(shù)據(jù)庫、RPC服務(wù)等,它們需要訪

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包