8 lines
996 B
Markdown
8 lines
996 B
Markdown
# Golang 是值传递还是引用传递
|
||
|
||
如同 C 系列的所有语言一样,Go 语言中的所有东西都是以值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就像有一个赋值语句将值赋给参数一样。
|
||
|
||
当调用函数进行传参或进行赋值时,Go 语言将会创建对象的副本。
|
||
|
||
比较让人疑惑的是 slice、map、chan 等引用类型,改变了引用对象副本的内容,其本体也发生了变化,这看起来很像引用传递。事实上,对于引用类型,Go 语言在赋值时创建了这个引用对象的副本,如果把引用对象看作指针,这就等同于创建了一个指针的副本,但副本指针和原指针都指向同一片内存区,因此改变副本内容,本体也会跟着变化。但仔细观察就会发现,用于存储副本指针的内存空间与原指针内存空间并不相同。所以,对于引用类型而言,Go 语言进行的是引用地址的值传递。
|