diff --git a/Software/Development/Language/Go/Basic/Golang_是值传递还是引用传递.md b/Software/Development/Language/Go/Basic/Golang_是值传递还是引用传递.md new file mode 100644 index 0000000..8c40484 --- /dev/null +++ b/Software/Development/Language/Go/Basic/Golang_是值传递还是引用传递.md @@ -0,0 +1,7 @@ +# Golang 是值传递还是引用传递 + +如同 C 系列的所有语言一样,Go 语言中的所有东西都是以值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就像有一个赋值语句将值赋给参数一样。 + +当调用函数进行传参或进行赋值时,Go 语言将会创建对象的副本。 + +比较让人疑惑的是 slice、map、chan 等引用类型,改变了引用对象副本的内容,其本体也发生了变化,这看起来很像引用传递。事实上,对于引用类型,Go 语言在赋值时创建了这个引用对象的副本,如果把引用对象看作指针,这就等同于创建了一个指针的副本,但副本指针和原指针都指向同一片内存区,因此改变副本内容,本体也会跟着变化。但仔细观察就会发现,用于存储副本指针的内存空间与原指针内存空间并不相同。所以,对于引用类型而言,Go 语言进行的是引用地址的值传递。