golang中new和make的区别

admin 2024-10-24 23:38:31 编程 来源:ZONE.CI 全球网 0 阅读模式

在Golang中,我们经常会用到new和make这两个关键字来分配内存。虽然它们的作用看起来很相似,但实际上它们有着不同的使用方式和适用范围。在本文中,我们将详细阐述new和make的区别。

new关键字的使用

new是一个用于创建类型实例的内建函数。它返回一个指向已分配内存的指针,其中这片内存被初始化为零值。使用new关键字,我们可以创建各种基本类型、自定义类型、指针等。

new关键字的语法如下:

ptr := new(Type)

其中,Type表示要创建的类型。new函数将根据类型的大小分配足够的内存,并返回一个指向该内存的指针。由于返回的是一个指针,因此我们可以使用箭头符号来访问其属性或方法。

下面是一个使用new关键字的示例:

type Person struct {
    Name string
    Age  int
}

func main() {
    p := new(Person)
    p.Name = "Alice"
    p.Age = 25
    fmt.Println(p)
}

在上述示例中,我们使用new关键字创建了一个Person类型的实例,并设置了其Name和Age属性的值。最后,我们通过打印实例来验证它是否成功创建。

make关键字的使用

make是一个用于创建切片、映射和通道的内建函数。与new关键字不同,make函数返回的是一个已经初始化后的(非零值)引用。

make关键字的语法如下:

slice := make([]Type, length, capacity)
map := make(map[KeyType]ValueType)
channel := make(chan Type)

在上述语法中:

  • slice表示用于创建切片的变量
  • Type表示要创建的切片类型
  • length表示切片的长度/大小
  • capacity表示切片的容量(可选参数,默认为切片的长度)
  • map表示用于创建映射的变量
  • KeyType表示映射的键类型
  • ValueType表示映射的值类型
  • channel表示用于创建通道的变量

下面是一些使用make关键字的示例:

使用make创建切片:

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

在上述示例中,我们使用make函数创建了一个包含5个整数的切片,其容量为10。由于使用了make关键字,切片将被初始化为非零值,即默认情况下,其元素会被赋予类型的零值。

使用make创建映射:

m := make(map[string]int)

在上述示例中,我们使用make函数创建了一个字符串到整数的映射。与切片类似,由于使用了make关键字,映射将被初始化为非零值。此时,我们可以直接对映射进行操作,而不需要再次分配内存。

使用make创建通道:

c := make(chan int)

在上述示例中,我们使用make函数创建了一个整数型的通道。同样地,由于使用了make关键字,通道将被初始化为非零值。我们可以通过通道进行并发操作,向其中发送和接收数据。

综上所述,new关键字用于创建各种类型的实例,并返回一个指向已分配内存的指针。而make关键字则专门用于创建切片、映射和通道,并返回一个已经初始化后的(非零值)引用。虽然new和make在某些情况下可以互换使用,但我们应该根据具体需要选择合适的关键字,以确保代码的正确性和性能优化。

weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
golang中new和make的区别 编程

golang中new和make的区别

在Golang中,我们经常会用到new和make这两个关键字来分配内存。虽然它们的作用看起来很相似,但实际上它们有着不同的使用方式和适用范围。在本文中,我们将详
golang deamon 编程

golang deamon

golang守护程序(Deamon):如何实现高性能的后台任务处理在现代互联网应用开发中,后台任务处理是非常常见且重要的需求。一个高性能、可靠的后台任务处理系统
golang协程gmp 编程

golang协程gmp

Golang协程GMP:优雅并发的基石在Golang中,协程是一种轻量级线程,被广泛应用于并发编程。而协程的调度器则是Golang实现协程并发的核心组件之一。G
golang对象池应用 编程

golang对象池应用

在高并发的Web应用中,对象池是一种非常常见的优化技术。对象池通过预先分配和管理一定数量的对象,并将其缓存起来以供复用,从而避免了频繁的对象创建和销毁操作,提高
评论:0   参与:  0