09、指针: new 和 make

01、指针:不同于c语言的指针可直接操作

--go语言中指针只能
    --取地址 以及 按照地址取值
    --指针不能够直接操作取值,尽管牺牲了效率但是避免了溢出的问题

--代码示例:
	// 1、取地址:&
	// 2、按照地址取值:*
	n := 18
	p := &n
	fmt.Println(p)        // 取出变量地址
	fmt.Printf("%T\n", p) // *int 表示int类型的指针

	// 按照地址取值
	m := *p
	fmt.Println(m)        // 取出地址对应的值
	fmt.Printf("%T\n", m) // 地址对应的值的类型 int

02、new:给基础数据类型变量分配地址

--指定变量直接使用会有问题,报错空指针
	// 一个指针只进行定义,没有初始化值都会被认为是nil空指针,即报错
	// panic: runtime error: invalid memory address or nil pointer dereference
	var a *int
	*a = 100
	fmt.Println(*a)
--new()函数初始化指针的时候会给一个地址:
	// new关键字申请地址
	var a1 *int
	fmt.Println(a1) // <nil>

	var a2 = new(int)
	fmt.Println(a2)  // 0xc0000100b8
	fmt.Println(*a2) // 在赋值之前打印其值为0
	*a2 = 100
	fmt.Println(*a2) // 在赋值之后之后打印值为100

3、make:给slice map 以及 channel三种数据类型变量分配地址

--make:make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。
    --就是slice切片中初始化切片的那个make函数

4、new与make的区别

1、二者都是用来做内存分配的。
2、make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
3、而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值