NotePublic/Software/Development/Language/Go/Basic/Golang_是值传递还是引用传递.md

8 lines
996 B
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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