golang语言-map作为函数参数传递
func main(){
m := make(map[int]int)
m[1] = 1
fmt.Printf("原始map的内存地址是:%p\n", m)
modify(m)
fmt.Println("map值被修改了,新值为:", m)
}
func modify(m interface{}){
fmt.Printf("函数里接收到map的内存地址是:%p\n", m)
p := m.(map[int]int)
p[1] = 2
}
如上:
在main函数中,m是个指针变量,它保存的值是:0xc00009e030。
在modify函数中,m也是个指针变量,保存的值也是:0xc00009e030。
知识点1:
Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。且传参和赋值(=)的操作本质是一样的。
拷贝的内容分为 非引用类型 和 引用类型 两种类型
非引用类型:int、string、struct、array 这样就不能修改原内容数据。
引用类型:指针、map、slice、chan ,这样就可以修改原内容数据。
总结: 初始化map后,返回的是指针变量,在函数之间,传递的是map的地址。在函数修改map会在主程序中表现出来,说明map虽然值传递,但是最终指向都是引用类型。
知识点2:
interface{} 类型是没有方法的接口。由于没有 implements 关键字,所以所有类型都至少实现了 0 个方法,所以 所有类型都实现了空接口。这意味着,如果您编写一个函数以 interface{} 值作为参数,那么您可以为该函数提供任何值。例如:
func DoSomething(v interface{}) {
// ...
}
总结:空接口 interface{} 类似 Java 中的 Object 类型。任何变量都可以赋值给interface{}类型的变量。interface{} 的值不是任意类型,而是 interface{} 类型,函数可以接受 interface{} 作为参数,但最好不要返回 interface{}