c语言编程笔录

首页 >   > 笔记大全

笔记大全

Go语言中new和make关键字的区别是什么

更新时间:2023-07-22

前言:

在Go语言中,new和make是两个用于分配内存的关键字。尽管它们的作用有些相似,但是它们被用于不同的数据类型。new用于分配零值得内存并返回指针,而make用于其他的初始化操作。本文将详细解释new和make关键字在Go语言中的区别。

1. new关键字

new是Go语言中的一个内置函数,其作用是分配内存并返回指定类型变量的地址(指针)。具体而言,new函数接受一个参数,该参数必须是一个类型而不是一个值或者指针。new函数会根据指定的类型分配内存,并返回该类型的指针。被返回的指针对应的值将会是该类型的零值。下面是一个示例:

package main

import "fmt"

func main() {
    var i *int

    i = new(int)
    fmt.Println(*i)  // 输出: 0
}

上面的代码中,我们使用new关键字分配了一个int类型的指针,并输出了该指针对应的零值。此时,内存中被分配的空间为0。

2. make关键字

make是Go语言中另一个用于分配内存的内置函数。不同于new函数,make函数仅适用于内建数据类型(如slice、map和channel)。make函数的返回值与所创建的数据类型相关,而不是返回指针。make函数的语法如下所示:

make(T, args)

T是要创建的数据类型,args则为创建数据类型所需的参数。下面是一些使用make关键字的示例:

package main

import "fmt"

func main() {
    // 创建一个整数slice
    s := make([]int, 5, 10)
    fmt.Printf("slice: %v, length: %d, capacity: %d\n", s, len(s), cap(s))

    // 创建一个映射
    m := make(map[string]int)
    m["one"] = 1
    fmt.Println(m)

    // 创建一个通道
    c := make(chan int)
    fmt.Println(c)
}

上面的代码中,我们使用make关键字分别创建了一个整数slice、一个映射和一个通道。可以看到,make函数为这些特定的数据类型分配了合适的内存,我们可以直接使用它们而不需要手动分配内存。

总结:

总而言之,new和make是Go语言中用于分配内存的关键字,但它们用于不同的数据类型。new关键字用于分配指定类型的零值内存,并返回该类型的指针,而make关键字用于创建一些具有特殊初始化需求的内建类型,并返回相应的数据类型。根据实际需要,我们可以使用这两个关键字来满足变量分配内存的需求。