1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Golang函數(shù)參數(shù)的值傳遞和引用傳遞

        共 2566字,需瀏覽 6分鐘

         ·

        2021-07-22 05:29

        目錄

        • 1、值傳遞

        • 2、引用傳遞


        1、值傳遞

        golang有值傳遞與引用傳遞兩種傳遞方式

        函數(shù)如果使用參數(shù),該變量可稱為函數(shù)的形參。形參就像定義在函數(shù)體內(nèi)的局部變量

        值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)

        也就是說(shuō),函數(shù)傳遞的原來(lái)數(shù)據(jù)的拷貝,一個(gè)副本,比如當(dāng)傳遞一個(gè)int類型的參數(shù),傳遞的其實(shí)是這個(gè)參數(shù)的一個(gè)副本。傳遞一個(gè)指針類型的參數(shù),其實(shí)傳遞的就是這個(gè)指針類型的拷貝,而不是這個(gè)指針執(zhí)行的值

        默認(rèn)情況下,Go語(yǔ)言使用的是值傳遞(則先拷貝參數(shù)的副本,再將副本傳遞給函數(shù)),即在調(diào)用過(guò)程中不會(huì)影響到實(shí)際參數(shù)

        代碼示例:

        package main

        import "fmt"

        func main() {
         /* 定義局部變量 */
         var a int = 100
         var b int = 200

         fmt.Printf("交換前 a 的值為 : %d\n", a)
         fmt.Printf("交換前 b 的值為 : %d\n", b)

         /* 通過(guò)調(diào)用函數(shù)來(lái)交換值 */
         swap(a, b)

         fmt.Printf("交換后 a 的值 : %d\n", a)
         fmt.Printf("交換后 b 的值 : %d\n", b)
        }

        /* 定義相互交換值的函數(shù) */
        func swap(x, y int) {
         var temp int

         temp = x /* 保存 x 的值 */
         x = y    /* 將 y 值賦給 x */
         y = temp /* 將 temp 值賦給 y*/

         return
        }
        /*
        交換前 a 的值為 : 100
        交換前 b 的值為 : 200
        交換后 a 的值 : 100
        交換后 b 的值 : 200
         */

        因?yàn)樯鲜龀绦蛑惺褂玫氖侵祩鬟f,所以兩個(gè)值并沒(méi)有實(shí)現(xiàn)交換,可以使用引用傳遞來(lái)實(shí)現(xiàn)交換

        2、引用傳遞

        引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)

        由于引用類型(slice、map、interfacechannel)自身就是指針,所以這些類型的值拷貝給函數(shù)參數(shù),函數(shù)內(nèi)部的參數(shù)仍然指向它們的底層數(shù)據(jù)結(jié)構(gòu)

        代碼示例:

        package main

        import "fmt"

        func main() {
         /* 定義局部變量 */
         var a int = 100
         var b int = 200

         fmt.Printf("交換前,a 的值 : %d\n", a)
         fmt.Printf("交換前,b 的值 : %d\n", b)

         /* 調(diào)用 swap() 函數(shù)
          * &a 指向 a 指針,a 變量的地址
          * &b 指向 b 指針,b 變量的地址
          */

         swap(&a, &b)

         fmt.Printf("交換后,a 的值 : %d\n", a)
         fmt.Printf("交換后,b 的值 : %d\n", b)
        }

        func swap(x *int, y *int) {
         var temp int
         temp = *x /* 保存 x 地址上的值 */
         *x = *y   /* 將 y 值賦給 x */
         *y = temp /* 將 temp 值賦給 y */
        }
        /*
        交換前,a 的值 : 100
        交換前,b 的值 : 200
        交換后,a 的值 : 200
        交換后,b 的值 : 100
         */

        瀏覽 44
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产黄色全禁视频网 | 可以直接看的黄色网址 | 精品成人无码A片观看香草视频 | 攻给受下药囚禁强制爱h | 大学生一级一a免费 | 欧美色交 | 日韩黄片免费看 | 免费国产在线精品 | 性生交免费大片 | 欧美夫妻性生活网 |