前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈go语言中的make和new的区别

浅谈go语言中的make和new的区别

原创
作者头像
言志志
发布2023-10-15 20:43:26
2340
发布2023-10-15 20:43:26
举报
文章被收录于专栏:Go语言学习笔记Go语言学习笔记

前言

本文是探讨的是"go语言中的make和new的区别"

此文章是个人学习归纳的心得 , 如有不对, 还望指正, 感谢!

使用范围不同

make内置函数仅用于slice(切片),map(映射),chan(管道)类型的对象的分配并初始化

代码语言:txt
复制
package main

import "fmt"

func main() {

   // 创建
   sliceDemo := make([]string, 6, 6)
   mapDemo := make(map[int]string)
   mapDemo2 := make(map[int]string, 1)
   chanDemo := make(chan int, 10)

   // 进行打印
   mapDemo2[1] = "1"
   mapDemo2[2] = "2"
   fmt.Printf("sliceDemo:%v %[1]T len:%[2]v cap:%[3]v \n", sliceDemo, len(sliceDemo), cap(sliceDemo))
   fmt.Printf("mapDemo:%v %[1]T len:%[2]v \n", mapDemo, len(mapDemo))
   fmt.Printf("mapDemo2:%v %[1]T len:%[2]v  \n", mapDemo2, len(mapDemo2))
   fmt.Printf("chanDemo:%v %[1]T len:%[2]v cap:%[3]v \n", chanDemo, len(chanDemo), cap(chanDemo))

}

输出结果:

new可以用于任何类型的创建,不像make不能用于结构体的创建,new就可以

代码语言:txt
复制
package main

import "fmt"

func main() {
 
   // 定义学生结构体
   type stu struct {
      name string
      age  int
   }

   // new一个
   y3 := new(stu)
  
   fmt.Printf("y3 :%v %[1]T \n", y3)
}

返回值不同

make的返回类型与其参数的类型相同,而new返回的是指向传入类型的指针。

代码语言:txt
复制
package main

import "fmt"

func main() {

   type stu struct {
      name string
      age  int
   }


   y1 := stu{"yzc", 20}
   y2 := &stu{"yzc", 20}
   y3 := new(stu)

   fmt.Printf("y1 :%v %[1]T \n", y1)
   fmt.Printf("y2 :%v %[1]T \n", y2)
   fmt.Printf("y3 :%v %[1]T \n", y3)
}

我们深入分析 , 可以发现发现make函数返回的是一个已初始化的非零值对象。对于slice和map,make函数还会分配内存并返回一个引用,而对于channel,make函数会返回一个引用(channel类型的值本身就是引用类型)。

代码语言:go
复制
slice := make([]int, 0, 10) // 创建一个长度为0,容量为10的切片
m := make(map[string]int) // 创建一个空的map
ch := make(chan int, 10) // 创建一个带有缓冲区的channel

而new函数只分配内存,并没有进行初始化操作。

代码语言:go
复制
p := new(int) // 创建一个int类型的零值对象,并返回指向该对象的指针

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 使用范围不同
  • 返回值不同
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档