golang中的make和new的思考

1 篇文章 0 订阅
本文详细介绍了Go语言中`new`和`make`的区别。`new`用于分配内存并返回类型指针,初始化为零值;`make`则专用于初始化切片、映射和通道,返回已初始化的对象。文章通过示例代码阐述了变量声明、定义、初始化和赋值的概念,并对比了指针和引用的特点。此外,还探讨了不同机器位宽下指针的大小。
摘要由CSDN通过智能技术生成


很多文章对make和new做了很多说明,大多的论述区别是 new 用来分配内存,不初始化内存,指向零值;make用作构建slice,map 和 chan,用来分配内存和初始化一个对象,有点背天数的味道。我觉得可以从两个方面来理解,1区分变量申明,定义,初始化和赋值几个概念;2理解引用和指针。

目录

1 概念变量申明,定义,初始化和赋值

2 引用和指针

指针

引用

3 new和make


1 概念变量申明,定义,初始化和赋值

申明,定义,初始化和赋值,是基于博文C++ 声明、定义、初始化、赋值_twdlll的博客-CSDN博客理解。

声明:只是规定了变量的类型和名字,而没有进行内存分配。
定义:不仅规定了变量的类型和名字,而且进行了内存分配,会进行初始化。
初始化:当对象在创建时获得了一个特定值。
赋值:擦除原有的值,并赋予新值。

这里解释下初始化和赋值,初始化这个场景通常伴随着变量的定义,定义好后会为它分配内存空间,然后将该内存空间首次赋值,而这种设置值的行为可以是编写程序的赋值如下,也可以是编译器的默认行为(例如:golang中new时初始值设置为对应类型零值);赋值是编程中常见操作,意味着已申请了内存空间。

package main
import "fmt"
func main() {
	// 初始化
	var a int = 12
	// 赋值
	var b int
	b = a
	fmt.Println(a)
	fmt.Println(b)
}

对于上面代码的一个解读是如下。

第1行:声明并定义了变量a,且为a初始化为12。

第2行:声明并定义了变量b,并为b初始化为0值。

第3行:为b赋值变量a的值。

2 引用和指针

指针

指针是一个变量,该变量存储了其他变量的地址。提到指针通常我们也会提到指向的概念,指向这是个动词,它描述一种现象,该现象是变量里面存着其他变量的地址,且可以通过一些语法(例如:*a取值)对该变量赋值和取值。

小知识:指针变量大小和机器位有关。

16位机器的代码时,指针占2个字节

32位机器的代码时,指针占4个字节

64位机器的代码时,指针占8个字节

引用

引用是一块内存的别名,也就是两个变量的值是一样的,操作的变量不同,这和硬链接文件类似(相同的inode),在go中都是值传递而非引用。

3 new和make

每种类型都有自己的零值。new返回指针类型,分配内存,内存里存的值是对应类型的零值。简单类型零值和初始赋值没什么区别,对于复杂类型slice,map和chan其零值和nil,他们的底层是复杂数据结构类型,不能用指针方式来表示。make分配和初始化内存,返回的是原始类型,但底层是数据引用类型,对于复杂的类型需要初始化(这是为什么说make返回的类型是初始化后的)。

参考文章:

golang 内置函数new()和make()的区别_linlujun__的博客-CSDN博客_golang new和make的区别

new和make的区别_叫我峰兄的博客-CSDN博客

60秒问答:new 底层原理 - 墨天轮

C++ new和delete原理及应用!_Disremembrance的博客-CSDN博客

C++:带你理解new和delete的实现原理 - 掘金

C++手稿:哪些变量会自动初始化? | Harttle Land

C语言变量初始化是必须的吗?不初始化会怎样?

变量的声明、变量的定义、变量的初始化_Haley_Wong的博客-CSDN博客_变量的初始化

golang中make和new的区别_少林码僧的博客-CSDN博客_golang make new 区别你确定你搞懂make和new的区别了吗?

C++ 声明、定义、初始化、赋值_twdlll的博客-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值