golang—new和make

系列文章目录



一、new

下面的代码是关于new的创建和使用new的一些操作
在下面的代码我们可以了解到new的作用是创建一个任意类型的指针。
new函数创建任何一个类型都不是空的他是让内存分配了一个地址空间,什么也没有存。不是做到一个初始化的一个功能,所以引用类型不可以用new来进行一个初始化,但是切片例外他可以通过appde函数来进行初始化。
在值类型为什么有可以用new来 “初始化”呢?因为在golang中默认对值类型进行赋予了初始值。

func NewCase() {
	//new可以创建任意类型,并返回一个指针
	mpPtr := new(map[string]*user)
	//new函数创建任何一个类型都不为空,他是创建一个指针,在我们的内存里头分配一个地址空间 但是这个地址空间什么也没存 是一个空的 一个0值
	if *mpPtr == nil { //为什么加这个* 因为他的地址一定不为空 为空的是他的一个值 (引用类型)
		fmt.Println("map是空的")
	}
	slicePtr := new([]int)
	if *slicePtr == nil { //为什么加这个* 因为他的地址一定不为空 为空的是他的一个值 (引用类型)
		fmt.Println("切片是空的", slicePtr)
	}
	//fmt.Println((*slicePtr)[0]) panic: runtime error: index out of range [0] with length 0 这就说明所有引用类型用new创建以后是值是空的,并且会分配一个指针空间
	*slicePtr = append(*slicePtr, 1) //切片可以用append添加元素
	//*mpPtr = append(*mpPtr,user{  map 不可以用append来添加元素
	//	Name: "tyg",
	//	Age:  0,
	//})
	userPtr := new(user)
	stringPtr := new(string) //new也不会给值类型做初始化 但是默认值类型是有初值的所以是可以直接使用
	*stringPtr = "你好"
	fmt.Println((*slicePtr)[0])
	fmt.Println(mpPtr, userPtr, *stringPtr)

}

二、meke

在golang中make仅用于切片、集合、通道的一个初始化。

func MakeCase() {
	//初始化切片设置长度和容量
	slice := make([]int, 10, 20) //在知道长度的前提下可以把长度设置好 就不会触发切片的扩容机制 ,对系统会好点
	slice[0] = 10
	//初始化集合,并设置集合的初始大小
	mp := make(map[string]string, 10)
	mp["A"] = "a" //刚刚有一个错误也就是map只有一个值
	//初始化通道,设置通道的读写方向和缓冲大小
	ch := make(chan int, 10)    //设置为int就只能走int类型 10是缓冲长度  像这种 设置了类型和长度的通道就证明这个通道是可读可写的
	ch1 := make(chan<- int, 10) //左箭头在chan后就是只写的
	ch2 := make(<-chan int)     //左箭头在chan前就是只读的   如果没有缓冲区那么我们的chan一定垚有读和写的逻辑 《携程》 缓冲区类似快递中的中转站
	fmt.Println(slice, mp, ch, ch1, ch2)
}

三、切片和map的操作

下面内容是对map和切片进行的一些操作.


func SliceAndMapCase() {
	//定义切片
	var slice []int
	slice = []int{1, 2, 3, 4, 5, 6}
	slice1 := make([]int, 10, 20) //在知道长度的前提下可以把长度设置好 就不会触发切片的扩容机制 ,对系统会好点
	slice1[0] = 10
	fmt.Println(slice, slice1)
	//切片的截取
	slice2 := make([]int, 5, 10)
	fmt.Println(len(slice2), cap(slice2))
	slice2[0] = 0
	slice2[1] = 1
	slice2[2] = 2
	slice2[3] = 3
	slice2[4] = 4

	slice3 := slice2[2:5] //左边包括右边不包括  //这个是不能他的返回最大是   0:10
	fmt.Println(len(slice3), cap(slice3), slice3)

	//切片的附加
	slice3 = append(slice3, 1, 2, 3, 5, 4, 5, 8, 5) //当切片的数据往后面加时 超过cap就可以直接扩容
	fmt.Println(len(slice3), cap(slice3), slice3)

	//golang集合,无序   //在其他语言中其他语言是有序的
	mp := make(map[string]string, 10)
	mp["A"] = "a"
	mp["B"] = "b"
	mp["C"] = "c"
	mp["D"] = "d"
	fmt.Println(mp)
	//golang可以未知
	for k, s := range mp { //从这个就可以看出 在golang里面的集合是无序的
		fmt.Println(k, s)
	}
	delete(mp, "D")
	fmt.Println(mp)

}


总结

new和make的区别就是。
new是分配内存空间的。
make是初始化的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天你学golang了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值