<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      golang函數(shù)傳遞slice是值傳遞還是引用傳遞?

      先說(shuō)結(jié)論:go中所有的函數(shù)傳參都為值傳遞
      在 Go 語(yǔ)言中,切片(slice)是引用類型,因此在函數(shù)調(diào)用中傳遞切片時(shí),實(shí)際上是傳遞了切片的引用(地址),而不是切片的副本。這意味著對(duì)傳遞的切片進(jìn)行修改會(huì)影響原始切片的內(nèi)容。

      當(dāng)將切片作為函數(shù)參數(shù)傳遞時(shí),函數(shù)接收的是切片的引用。這使得函數(shù)可以訪問(wèn)和修改原始切片的元素,而無(wú)需進(jìn)行顯式的指針操作。

      下面是一個(gè)示例代碼來(lái)說(shuō)明切片是如何通過(guò)引用傳遞的:

      package main
      
      import "fmt"
      
      func modifySlice(s []int) {
          s[0] = 100
          s = append(s, 200)
      }
      
      func main() {
          slice := []int{1, 2, 3}
          fmt.Println("Before:", slice) // 輸出: [1 2 3]
      
          modifySlice(slice)
          fmt.Println("After:", slice) // 輸出: [100 2 3],這里并沒(méi)有append的200!!
      }
      

      在上面的示例中,我們定義了一個(gè) modifySlice 函數(shù),它接收一個(gè)切片作為參數(shù)。在函數(shù)內(nèi)部,我們將切片的第一個(gè)元素修改為 100,并向切片追加一個(gè)新的元素 200。

      main 函數(shù)中,我們創(chuàng)建了一個(gè)切片 slice,并將其傳遞給 modifySlice 函數(shù)。在函數(shù)內(nèi)部,我們修改了切片的第一個(gè)元素,并追加了一個(gè)新的元素。然后,我們?cè)?main 函數(shù)中打印輸出原始切片 slice,可以看到修改已經(jīng)影響了原始切片的內(nèi)容。

      這表明切片在函數(shù)調(diào)用中是貌似通過(guò)引用傳遞的,因?yàn)楹瘮?shù)對(duì)切片的修改會(huì)影響原始切片。這種行為與值類型(如整數(shù)、字符串等)的傳遞方式不同,值類型在函數(shù)調(diào)用中是通過(guò)值傳遞的,函數(shù)對(duì)值類型的修改不會(huì)影響原始值。

      既然是引用傳遞,為啥外層slice沒(méi)有最后一個(gè)元素200呢?

      slice包含三個(gè)成員:指向底層數(shù)組的指針,slice的長(zhǎng)度,長(zhǎng)度的容量

      go中所有的函數(shù)傳參都為值傳遞,當(dāng)slice作為入?yún)ⅲ⑶覍?duì)slice進(jìn)行修改時(shí),由于指向數(shù)組的指針指向同一個(gè)地址,對(duì)數(shù)組的修改會(huì)同步到函數(shù)外部的切片上;但是slice的長(zhǎng)度和容量是兩個(gè)值變量,函數(shù)內(nèi)部對(duì)他們的修改無(wú)法傳遞到函數(shù)外,所以會(huì)造成函數(shù)內(nèi)對(duì)slice進(jìn)行append操作,底層數(shù)組發(fā)生了變化,但是函數(shù)外部slice因無(wú)法感知內(nèi)部切片長(zhǎng)度的變化,而沒(méi)有修改的情況;另外,當(dāng)slice的長(zhǎng)度要超出slice的容量時(shí),slice會(huì)進(jìn)行擴(kuò)容:申請(qǐng)一塊新的地址作為底層數(shù)組,將舊的數(shù)組上的值拷貝過(guò)來(lái),擴(kuò)容完成后,函數(shù)內(nèi)切片指向的數(shù)組與函數(shù)外切片指向的數(shù)組就不再是同一個(gè)地址,所有的修改都不會(huì)生效。

      點(diǎn)擊查看代碼
      func main() {
      	slice := []int{1, 2, 3}
      	fmt.Println("Before:", slice) // 輸出: [1 2 3]
      
      	modifySlice(slice)
      	fmt.Println("After:", slice) // 輸出: [1 2 3]
      
      }
      
      func modifySlice(s []int) {
      	s = append(s, 4) //長(zhǎng)度要超出slice的容量時(shí),slice會(huì)進(jìn)行擴(kuò)容:申請(qǐng)一塊新的地址作為底層數(shù)組,將舊的數(shù)組上的值拷貝過(guò)來(lái),擴(kuò)容完成后,函數(shù)內(nèi)切片指向的數(shù)組與函數(shù)外切片指向的數(shù)組就不再是同一個(gè)地址,后面所有的修改都不會(huì)生效
      	s[0] = 100
      	fmt.Println("temp:", s) // 輸出: [100 2 3 4]
      }
      
      slice := []int{1, 2, 3}
      fmt.Println("Before:", slice) // 輸出: [1 2 3]
      
      modifySlice(slice)
      fmt.Println("After:", slice) // 輸出: [1 2 3]
      

      }

      func modifySlice(s []int) {
      s = append(s, 4) //長(zhǎng)度要超出slice的容量時(shí),slice會(huì)進(jìn)行擴(kuò)容:申請(qǐng)一塊新的地址作為底層數(shù)組,將舊的數(shù)組上的值拷貝過(guò)來(lái),擴(kuò)容完成后,函數(shù)內(nèi)切片指向的數(shù)組與函數(shù)外切片指向的數(shù)組就不再是同一個(gè)地址,后面所有的修改都不會(huì)生效
      s[0] = 100
      fmt.Println("temp:", s) // 輸出: [100 2 3 4]
      }

      解決方案:將切片的指針作為參數(shù)傳遞進(jìn)去

      func append_test (arr []int) {
      arr = append(arr, 555,555)
      (
      arr)[0] = 55 //注意這里的寫法 (arr)[] //arr[] 會(huì)被編譯器理解為*(arr[index])
      }

      posted @ 2024-06-19 17:44  daniel456  閱讀(474)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产91丝袜在线观看| 精品一区二区久久久久久久网站| 日韩精品中文字幕人妻| 欧美无人区码suv| 久99久热这里只有精品| 中文字幕精品人妻丝袜| 久久这里都是精品一区| 亚洲码和欧洲码一二三四| 日韩国产精品区一区二区| 综合激情亚洲丁香社区| 亚洲午夜成人精品电影在线观看| 淮南市| 久久亚洲精品亚洲人av| 亚洲一区二区三午夜福利| 国产香蕉97碰碰久久人人| 性欧美暴力猛交69hd| 少妇激情av一区二区三区| 国产亚洲日韩av在线播放不卡| 亚洲精品久荜中文字幕| 91亚洲一线产区二线产区| 亚洲午夜天堂| 99精品热在线在线观看视| 亚洲经典av一区二区| 国产美女裸身网站免费观看视频| 久章草这里只有精品| 四虎永久地址www成人| 国产亚洲中文字幕久久网| 欧美福利电影A在线播放| 狠狠色丁香婷婷综合尤物| 无码av人片在线观看天堂| 色九九视频| 国产又爽又黄的精品视频| 国产精品视频一区不卡| 国产粉嫩学生高清专区麻豆| 成人网站免费看黄a站视频| 亚洲丰满熟女一区二区蜜桃| 南康市| 久久亚洲国产精品五月天| 综合色一色综合久久网| 久久99精品久久久久久9| 精品国产一区二区三区卡|