一文读懂:golang中New函数和Make函数的区别

代码示例2阅读3分35秒

在Go语言中,new和make都是用于内存分配的内建函数,但它们的用途、参数、返回值和安全性等方面存在显著的区别。

new 函数

用途:new用于分配内存,并返回指向该类型的新分配的零值的指针。它通常用于分配值类型(如结构体、数组等)的内存空间。文章源自Golang编程指南-https://www.va26.com/work/315.html

New函数参数:new函数只接受一个参数,即要分配内存的类型。文章源自Golang编程指南-https://www.va26.com/work/315.html

New函数返回值:new返回一个指向新分配的零值的指针,该指针的类型为*T,其中T是传入new的类型参数。文章源自Golang编程指南-https://www.va26.com/work/315.html

New函数安全性:new函数是安全的,因为它返回的是指向新分配内存的指针,且该内存已经被初始化为零值。文章源自Golang编程指南-https://www.va26.com/work/315.html

New函数示例代码:文章源自Golang编程指南-https://www.va26.com/work/315.html

type Person struct {  
    Name string  
    Age  int  
}  
  
func main() {  
    p := new(Person)  
    fmt.Println(p) // 输出:&{ 0}  
}

make 函数

Make函数用途:make用于分配并初始化引用类型(切片、映射和通道)。这些类型在使用前必须初始化。文章源自Golang编程指南-https://www.va26.com/work/315.html

Make函数参数:make函数的参数取决于要创建的类型。对于切片,它接受一个类型、长度和容量(可选);对于映射,它接受一个类型和一个表示初始大小的整数;对于通道,它只接受一个类型。文章源自Golang编程指南-https://www.va26.com/work/315.html

Make函数返回值:make返回一个初始化后的对象,该对象的类型取决于传入的类型参数。对于切片,它返回一个切片对象;对于映射,它返回一个映射对象;对于通道,它返回一个通道对象。文章源自Golang编程指南-https://www.va26.com/work/315.html

Make函数安全性:make函数也是安全的,因为它返回的是已经初始化的对象,可以直接使用而无需进一步的初始化操作。文章源自Golang编程指南-https://www.va26.com/work/315.html

Make函数示例代码:文章源自Golang编程指南-https://www.va26.com/work/315.html

切片示例:

func main() {  
    s := make([]int, 5, 10) // 创建一个初始长度为5,容量为10的整数切片  
    fmt.Println(s) // 输出:[0 0 0 0 0]  
}

映射示例:

func main() {  
    m := make(map[string]int, 10) // 创建一个初始大小为10的字符串到整数的映射  
    m["test"] = 100              // 添加一个键值对  
    fmt.Println(m) // 输出:map[test:100]  
}

通道示例:

func main() {  
    ch := make(chan int) // 创建一个整数通道  
    go func() {  
        ch <- 42 // 向通道发送一个整数42  
    }()  
    value := <-ch // 从通道接收一个整数并赋值给value变量  
    fmt.Println(value) // 输出:42  
}

newmake在Go语言中用于不同类型的内存分配和初始化。new主要用于分配值类型的内存空间,并返回指向该类型的指针;而make则用于分配和初始化引用类型(切片、映射和通道)。

 
  • 本文由golang编程指南作者原创,请勿恶意转载!
  • 转载请务必保留本文链接:https://www.va26.com/work/315.html
评论  2  访客  1  作者  1
    • 匿名网友
      匿名网友 0

      可以,讲明白了

        • admin
          admin

          @ 匿名网友 有什么问题可以随时留言,我们会尽力解答

      匿名

      发表评论

      匿名网友
      :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
      确定

      拖动滑块以完成验证