Go语言make和new关键字的区别及实现原理

在Go语言的程序开发中,`make`和`new`是两个大家常常用到的关键字,它们用于内存分配和数据结构的初始化。虽然它们的功能看似相似,但实际上却有着本质的区别。那么,`go语言make和new关键字的区别及实现原理`到底是什么呢?接下来我们就来深入探讨一下。

`new`函数详解

1. 功能与语法

`new`函数的主要功能是为一种类型的对象分配内存,并返回指向该类型的指针。简单来说,`new`创建了一个零值的对象,供程序使用。它的语法也非常简单,只需在关键字`new`后面加上类型名即可。

“`

func new(Type) Type

“`

2. 初始化案例

让我们看看一个简单的示例,怎样使用`new`函数:

“`go

package main

import “fmt”

type Person struct

Name string

Age int

}

func main()

p := new(Person)

fmt.Println(p) // 输出:& 0}

}

“`

在这个例子中,我们使用`new`创建了一个`Person`类型的指针`p`,并输出了它的值。注意,这个指针指向的一个零值的`Person`结构体。

`make`函数详解

1. 功能与语法

相比之下,`make`函数的用途主要集中在内置数据结构的创建,比如切片、映射和通道。`make`函数返回的一个已经初始化的(非零值)对象,其基本语法为:

“`

func make(Type, size IntegerType) Type

“`

2. 初始化案例

接下来,我们来看一个使用`make`的实例:

“`go

package main

import “fmt”

func main()

s := make([]int, 5, 10)

fmt.Println(s) // 输出:[0 0 0 0 0]

m := make(map[string]int)

m[“a”] = 1

m[“b”] = 2

fmt.Println(m) // 输出:map[a:1 b:2]

c := make(chan string)

fmt.Println(c) // 输出:0xc0000460c0

}

“`

在这个例子中,`make`成功创建了一个长度为5、容量为10的整数切片、一个字符串到整数的映射以及一个字符串通道。

`new`与`make`的区别

1. 分配的类型

– `new`可以用于任何类型的分配,并返回指向该类型的指针。

– `make`则仅限于切片、映射和通道,并返回初始化后的对象。

2. 返回值类型

– `new`返回的一个类型的指针,而`make`返回的则是初始化后的对象,且非零值。

3. 使用场景

– `new`通常用来创建值类型的实例,比如基本数据类型或结构体。

例如:

“`go

p1 := new(Person)

p1.Name = “Alice”

p1.Age = 25

“`

– 而`make`则用于创建引用类型的对象,如切片、映射和通道,确保这些对象在使用之前已经被 properly initialized。

“`go

s1 := make([]int, 5, 10)

“`

拓展资料

通过上面的讲解,相信大家对`go语言make和new关键字的区别及实现原理`有了更清晰的认识。虽然`new`和`make`都可以用于创建对象,但它们的用途、返回值和使用场景却截然不同。在日常编程中,熟练掌握这两者的区别将有助于进步代码的质量和性能。如果你还有什么难题,欢迎留言讨论!

版权声明

返回顶部