很多文章对make和new做了很多说明,大多的论述区别是 new 用来分配内存,不初始化内存,指向零值;make用作构建slice,map 和 chan,用来分配内存和初始化一个对象,有点背天数的味道。我觉得可以从两个方面来理解,1区分变量申明,定义,初始化和赋值几个概念;2理解引用和指针。
目录
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的区别
C++ new和delete原理及应用!_Disremembrance的博客-CSDN博客
C++手稿:哪些变量会自动初始化? | Harttle Land
变量的声明、变量的定义、变量的初始化_Haley_Wong的博客-CSDN博客_变量的初始化
golang中make和new的区别_少林码僧的博客-CSDN博客_golang make new 区别你确定你搞懂make和new的区别了吗?