map到底是不是引用类型

luckybee
luckybee 2019-10-12 字数 324

这种情况,m1就不会影响实参, 打印结果还是a:1,b:2

func mmap(m1 map[string]int) {

m1 = make(map[string]int)

}

这种情况,m1的实参就会被影响,打印结果是a:1

func mmap(m1 map[string]int) {

delete(m1, "b")

log.Println(&m1)

}

func main() {

m1 := make(map[string]int)

m1["a"] = 1

m1["b"] = 2

mmap(m1)

log.Println(m1)

}

Golang Go编程语言
11 个回复
DreamDreams
光风霁月 2019-10-12

是引用类型,你的例子也没毛病。

m1这个变量是个引用,情况1你修改了 m1变量本身

情况2你修改了m1指向的map的内容

【 在 luckybee (luckybee) 的大作中提到: 】

: 标  题: map到底是不是引用类型

: 发信站: 水木社区 (Sat Oct 12 16:31:17 2019), 站内

: 这种情况,m1就不会影响实参, 打印结果还是a:1,b:2

: func mmap(m1 map[string]int) {

:     m1 = make(map[string]int)

: }

: 这种情况,m1的实参就会被影响,打印结果是a:1

: func mmap(m1 map[string]int) {

:     delete(m1, "b")

:     log.Println(&m1)

: }

: func main() {

:     m1 := make(map[string]int)

:     m1["a"] = 1

:     m1["b"] = 2

:     mmap(m1)

:     log.Println(m1)

: }

: --

luckybee
luckybee 2019-10-12

但如果是引用类型,情况1,m1不应该变成空的map么?在函数里打印m1也是空的,但是外面打印m1就是没变化的

【 在 DreamDreams 的大作中提到: 】

: 是引用类型,你的例子也没毛病。

: m1这个变量是个引用,情况1你修改了 m1变量本身

: 情况2你修改了m1指向的map的内容

: ...................

luckybee
luckybee 2019-10-12

明白了

【 在 DreamDreams 的大作中提到: 】

: 是引用类型,你的例子也没毛病。

: m1这个变量是个引用,情况1你修改了 m1变量本身

: 情况2你修改了m1指向的map的内容

: ...................

noname
TrustNo1 2019-10-14

Go 都是值类型,没有引用类型的概念,第二个例子参数其实也是一个复制的对象,能修改只是因为复制的对象内部引用的 map 成员变量地址是一样的

【 在 luckybee (luckybee) 的大作中提到: 】

: 这种情况,m1就不会影响实参, 打印结果还是a:1,b:2

: func mmap(m1 map[string]int) {

:     m1 = make(map[string]int)

: ...................

diaozi
万仞霞光 2019-10-14

之前写脚本语言的吧…

写过c的,一般能理解这个

【 在 luckybee () 的大作中提到: 】

: 这种情况,m1就不会影响实参, 打印结果还是a:1,b:2

: func mmap(m1 map[string]int) {

:     m1 = make(map[string]int)

: }

doggeddog
羡慕你 2019-10-15

说得对,go没有引用类型

【 在 noname () 的大作中提到: 】

: Go 都是值类型,没有引用类型的概念,第二个例子参数其实也是一个复制的对象,能修改只是因为复制的对象内部引用的 map 成员变量地址是一样的

: 【 在 luckybee (luckybee) 的大作中提到: 】

eventvwr
精光互撸娃 2019-10-17

go还有指针,指针可以看成是引用类型的概念

【 在 noname (TrustNo1) 的大作中提到: 】

: Go 都是值类型,没有引用类型的概念,第二个例子参数其实也是一个复制的对象,能修改只是因为复制的对象内部引用的 map 成员变量地址是一样的

huanyingth
huanyingth 2019-10-27

看成c++的指针就行了

nikezhang
难得糊涂 2019-12-27

操作map本身不影响外面的实参,操作map里的元素就影响到外面map里的元素,和java类似啊,传进来的是map的引用,不是map的拷贝

【 在 luckybee (luckybee) 的大作中提到: 】

:  这种情况,m1就不会影响实参, 打印结果还是a:1,b:2

:  func mmap(m1 map[string]int) {

:      m1 = make(map[string]int)

nikezhang
难得糊涂 2019-12-27

外部map的引用还在啊,你传进来,有个局部变量指向了这个map,给这个局部变量重新赋值,相当于局部变量指向了别的地方啊,用java的map类比一下很容易理解

【 在 luckybee (luckybee) 的大作中提到: 】

:  但如果是引用类型,情况1,m1不应该变成空的map么?在函数里打印m1也是空的,但是外面打印m1就是没变化的

:  【 在 DreamDreams 的大作中提到: 】

jerryAndTom
adonisTony 01月16日

【 在 luckybee 的大作中提到: 】

: 这种情况,m1就不会影响实参, 打印结果还是a:1,b:2

: func mmap(m1 map[string]int) {

:     m1 = make(map[string]int)

: ...................