GO值类型和引用类型

1、在go语言中,值类型和引用类型有以下特点:

a、值类型:基本数据类型,int,float,bool,string,以及数组和struct
特点:变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放

b、引用类型:指针,slice,map,chan等都是引用类型
特点:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配,通过GC回收。

2.在传参时值类型和引用类型的区别

  1. 值类型在传参数时,是传的值的Copy,如:
func main() {
	a :=2
	func01(2)
    fmt.Printf("a的值为:%d",m)

}

func func01(a int) {
	a = 7
}
//输出:
//	a的值为:2
  1. 引用类型传参时,传的是地址,因为引用类型本身存的就是一个地址,所有在函数中对变量的操作都会影响外部的值
func main() {
	m :=[]map[string]string{{"type": "10", "msg": "hello."}}
	checkMissNode(m)
	fmt.Printf("print mString:%s",m)
}

func checkMissNode(items []map[string]string) {
	items[0]["one"] = `6`
}

//输出:
//print mString:[map[msg:hello. one:6 type:10]]

变量mitems都存了相同的地址,如下所示:

func main() {
	m :=[]map[string]string{{"type": "10", "msg": "hello."}}
	checkMissNode(m)
	fmt.Printf("m的地址为:%x",m)
}

func checkMissNode(items []map[string]string) {
	items[0]["one"] = `6`
	fmt.Printf("items的地址为:%x\n",items)

}
/**
* 输出 :
* items的地址为:[map[6d7367:68656c6c6f2e 6f6e65:36 74797065:3130]]
*     m的地址为:[map[6d7367:68656c6c6f2e 6f6e65:36 74797065:3130]]
*
*/

但是,下面的代码,在函数中,又将m2的地址赋值给了items,所以对items的修改不会影响外部值

func main() {
	m :=map[string]string{"type": "10", "msg": "hello."}
	checkMissNode(m)
	fmt.Printf("m的地址为:%x",m)
}

func checkMissNode(items map[string]string) {
	m2 :=make(map[string]string,0)
	items = m2
	items["one"] ="1"
	fmt.Printf("items的地址为:%x\n",items)

}
//输出
//items的地址为:map[6f6e65:31]
//m的地址为:map[6d7367:68656c6c6f2e 74797065:3130]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值