成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

終極真相:Go 中的參數傳遞

開發 后端
正確理解參數傳遞語義,可避免誤判內存行為、消除隱蔽 bug,使代碼行為更加可預測。

在 Go 社區常能聽到“按值傳遞”“按引用傳遞”兩種說法:

  • 基本類型、數組、結構體被稱為“按值”;
  • 指針、切片、映射、通道則被稱為“按引用”。

然而,上述分類容易造成誤解。在 Go 語言中,一切函數實參都以 值 的形式被復制傳遞。區別僅在于:

  • 復制的是“完整數據”(整數、數組等);
  • 復制的是“描述符”或指針(切片、映射、字符串等)。

理解這一點后,再看各類示例便能水落石出。

純值類型:數組、結構體等

func do(b [3]int) int {
    b[0] = 0         // 只修改副本
    return b[1]
}

func main() {
    a := [3]int{1, 2, 3}
    v := do(a)       // 傳參時完整復制
    fmt.Println(a, v) // [1 2 3] 2
}
  • a 在調用處被整體復制后傳入 do;
  • do 內部的任何修改都作用于該副本,原始數組保持不變。
  • 若想在被調函數內部改動調用者的數組,需改為 *[3]int。

描述符類型:映射(map)

func do(m map[int]int) {
    m[3] = 1
    m[4] = 3
}

func main() {
    m := map[int]int{4: 2}
    do(m)                      // 僅復制 map 頭部(指針)
    fmt.Println(m)             // map[3:1 4:3]
}
  • 傳入的 是一個指向運行時哈希表的指針副本;
  • 副本與原指針指向同一底層數據,因此鍵值修改對調用者可見;
  • 若在函數內執行 m = make(map[int]int),只會修改本地副本,不影響調用者。

切片:三字節描述符的特殊性

func do(s []int) int {
    s = append(s, 4) // 可能觸發重新分配
    s[0] = 0
    return s[1]
}

func main() {
    a := []int{1, 2, 3}         // len=3 cap=3
    v := do(a)                  // 復制切片頭部
    fmt.Println(a, v)           // [1 2 3] 2
}
  • 切片頭部 = 指針 + 長度 + 容量。
  • append 時容量不足會 分配新數組 并返回新的切片頭部;
  • 該新頭部僅存在于 do 中,調用者仍指向舊數組,因此 a[0] 未被修改。

若確需影響調用方切片的長度/容量,可顯式傳入 *[]T:

func do(s *[]int) {
    *s = append(*s, 4) // 直接改寫調用者變量
    (*s)[0] = 0
}

參數永遠“不是別名”

Go 永遠復制實參,將其存入被調函數棧幀;函數內變量 絕不是調用方變量的別名。想要修改調用者的數據:就傳遞能“間接定位”到它的東西(指針或接口值的內部指針)。

類型

傳遞時被復制的內容

何時能改到調用方數據

何時改不到

基本類型

整個值

總改不到

數組

整個數組

總改不到

結構體

整個結構體

總改不到

指針

指針本身

解引用后可改

修改指針本身

切片

指針+len+cap 描述符

修改底層數組元素

重新分配、改頭部

映射

指向哈希表的指針

改鍵值對

重新 make

通道

指向 channel 結構的指針

發/收消息

重新 make

字符串

指針+len 描述符(數據只讀共享)

無(只讀)

任何寫操作

結論與建議

(1) 牢記:Go 只有按值傳遞。不要再談“按引用”,最多是“值里裝著指針”。

(2) 修改調用者數據的途徑只有兩種:

  • 傳遞指針(*T、**T……);
  • 傳遞內部含指針的描述符(切片、map、通道)并操作其指向的共享數據。

(3) 重新分配(append、make 等)僅改變局部副本頭部,不會回寫調用方。

(4) 若你需要讓函數“生長”切片或重新綁定 map,使用指針語義:func f(s *[]T) 或 func g(m *map[K]V)。

正確理解參數傳遞語義,可避免誤判內存行為、消除隱蔽 bug,使代碼行為更加可預測。

責任編輯:趙寧寧 來源: 令飛編程
相關推薦

2011-03-25 13:44:28

Java值傳遞

2025-02-12 10:51:51

2012-02-21 14:04:15

Java

2023-11-17 14:10:08

C++函數

2017-12-05 08:53:20

Golang參數傳遞

2010-07-26 13:13:33

Perl函數參數

2021-03-02 10:50:23

SpringMVC 參數JavaWeb

2024-04-28 11:36:07

LambdaPython函數

2024-09-19 20:59:49

2017-10-26 11:44:19

工具語言編寫

2015-09-08 10:16:41

Java參數按值傳遞

2012-06-19 14:35:24

JSPJava亂碼

2023-03-29 23:23:00

MyBatis參數框架

2023-03-09 16:39:23

Python傳遞參數

2022-04-28 10:29:38

數據數據收集

2018-04-28 15:51:33

Mybatis方式傳遞

2010-03-11 11:07:37

Python函數參數

2022-01-04 10:25:32

Go參數加載

2020-12-14 05:59:20

物聯網技術售后體驗物聯網

2020-01-15 12:43:51

人工智能機器學習工程師
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久一区 | 日韩一区在线播放 | 国产这里只有精品 | 精品国产一区二区在线观看 | 韩国av在线 | 欧美性猛交99久久久久99按摩 | 欧美综合一区二区 | 黄色一级片网站 | 日日不卡av| 中文字幕日本 | 欧美久久网 | 国产黄色一区二区 | 日韩精品一 | 特黄a级片| 亚洲激情一区二区 | 成人高潮片免费网站 | 日韩在线小视频 | 亚洲国产第一页 | 午夜影院免费 | 欧美日韩在线免费观看 | 99国产在线观看 | 欧美日韩一区在线观看 | 深夜福利久久 | 黄色av免费在线观看 | 日本中文在线观看 | 久草网在线观看 | 日韩激情一区二区 | 精品免费在线观看 | 波多野吉衣一二三区乱码 | 精品一区二区三区在线观看 | 欧美专区在线 | 色哟哟一区二区 | 国产精品高潮呻吟久久 | 国产欧美日韩一区 | www4h| 五月天婷婷综合网 | 国产一级在线 | 成人羞羞国产免费游戏 | www四虎影院 | 久久久久久国产 | 免费一级黄色 |