Go语言中所有的传参都是值传递,都是一个副本或拷贝,且传参和赋值(=)的操作本质是一样的。拷贝的内容又分为:非引用类型、引用类型。
【非引用类型】int、string、struct、array,在子函数内修改这些就不会修改原函数的内容数据。
【引用类型】指针、map、slice、chan ,在子函数内修改这些是会修改原函数的内容数据。
切片
切片的传递为引用传递,但是注意引用的是切片中的元素而非切片本身。
【注意append】值类型的切片传递,会保持元素的修改影响原切片,但是切片元素的增删(append操作)不会影响原切片。
【但&slice1】指针类型的切片传递(指的是传递切片的指针,例如:&slice1),所有操作均会影响原切片。
map、channel
map和channel是相似的,初始化map后,返回的是指针变量,在函数之间传递的是map的地址,操作会影响原map。
在子函数里操作增加外层的map,在外层是生效的:
package main
import "encoding/json"
func main() {
tmap := make(map[string]string)
tmap["1"] = "1"
f(tmap)
tmapBytes, _ := json.Marshal(tmap)
println(string(tmapBytes)) // 打印:{"1":"1","2":"2"}
}
func f(tmap map[string]string) {
tmap["2"] = "2"
}