一文详解Golang中new和make的区别

Noella ·
更新时间:2024-11-13
· 1168 次阅读

目录

1. 简介

2. new 函数

2.1 new 函数的作用

2.2 new 函数的语法

3. make 函数

3.1 make 函数的作用

3.2 make 函数的语法

4. 区别对比

4.1 分配的类型

4.2 返回值类型

4.3 使用场景

4.4 示例代码对比

5. 总结

1. 简介

在 Go 语言中,new 和 make 是用于创建对象的两个内建函数,它们的使用方式和作用有所不同。正确理解 new 和 make 的区别对于编写高效的 Go 代码非常重要。下面我们将逐步介绍 new 和 make 的具体细节。

2. new 函数 2.1 new 函数的作用

new 函数用于创建一个指定类型的指针,并将其初始化为零值。它返回指向新分配的内存地址的指针。

2.2 new 函数的语法

new 函数的语法非常简单,只需在关键字 new 后面跟上类型即可。

 func new(Type) *Type

下面是一个使用 new 函数创建结构体对象的示例代码:

 package main  ​  import "fmt"  ​  type Person struct {      Name string      Age  int  }  ​  func main() {      p := new(Person)      fmt.Println(p)  }

在上述代码中,我们使用 new 函数创建了一个指向 Person 类型的指针 p,并输出其值。运行结果为 &{ 0},表明 p 是一个指向 Person 类型零值的指针。

3. make 函数 3.1 make 函数的作用

make 函数用于创建内建类型(如切片、映射和通道)的对象,它返回一个已初始化的(非零值)对象。

3.2 make 函数的语法

make 函数的语法与 new 函数有所不同,它需要指定类型和一些额外的参数。

 func make(Type, size IntegerType) Type

下面是一些使用 make 函数创建切片、映射和通道的示例代码:

 package main  ​  import "fmt"  ​  func main() {      // 创建一个长度为5,容量为10的整型切片      s := make([]int, 5, 10)      fmt.Println(s)      // 创建一个键为string,值为int的映射      m := make(map[string]int)      m["a"] = 1      m["b"] = 2      fmt.Println(m)      // 创建一个字符串通道      c := make(chan string)      fmt.Println(c)  }

在上述代码中,我们使用 make 函数创建了一个长度为 5,容量为 10 的整型切片 s,一个键为 string,值为 int 的映射 m,并创建了一个字符串通道 c。运行结果分别为 [0 0 0 0 0],map[a:1 b:2] 和 0xc0000460c0,表明这些对象都被初始化为非零值。

4. 区别对比 4.1 分配的类型

new 函数用于任何类型的分配,并返回一个指向该类型的指针。

make 函数只用于分配切片、映射和通道,并返回初始化后的切片、映射或通道对象。

4.2 返回值类型

new 函数返回指向分配类型的指针。

make 返回分配类型的初始化后的非零值。

4.3 使用场景 new 函数主要用于创建值类型的实例。值类型包括基本类型(如整型、浮点型、布尔型等)以及结构体。new 函数返回一个指向新分配内存的指针,可以方便地对该实例进行操作和修改。  package main  ​  import "fmt"  ​  type Point struct {      X, Y int  }  ​  func main() {      p := new(Point)      p.X = 10      p.Y = 20      fmt.Println(p) // 输出:&{10 20}  }

make 函数主要用于创建引用类型的对象。引用类型包括切片、映射和通道。由于引用类型需要在使用之前进行初始化,make 函数返回的是初始化后的非零值对象,而不是指针。

 package main  ​  import "fmt"  ​  func main() {      // 创建一个长度为5,容量为10的整型切片      s := make([]int, 5, 10)      fmt.Println(s) // 输出:[0 0 0 0 0]      // 创建一个键为string,值为int的映射      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  } 4.4 示例代码对比

通过下面的示例代码对比,我们可以更清楚地理解 new 和 make 之间的区别:

 package main  import "fmt"  ​  type Person struct {      Name string      Age int  }  ​  func main() {      // 使用new创建Person类型的指针      p1 := new(Person)      p1.Name = "Alice"      p1.Age = 25      fmt.Println(p1) // 输出:&{Alice 25}      // 使用make创建切片      s1 := make([]int, 5, 10)      s1[0] = 1      s1[1] = 2      fmt.Println(s1) // 输出:[1 2 0 0 0]  }

从示例代码可以看出,使用 new 创建的是指针类型,而使用 make 创建的是初始化后的非零值对象。

5. 总结

在本文中,我们详细介绍了 Golang 中 new 和 make 的区别及使用场景。通过对两者的语法和示例代码进行分析,我们得出以下结论:

new 用于任何类型的分配,并返回指向该类型的指针,主要用于创建值类型的实例。

make 用于分配切片、映射和通道,并返回初始化后的非零值对象,主要用于创建引用类型的对象。

正确理解 new 和 make 的区别对于编写高效、规范的 Go 代码至关重要。在选择使用 new 还是 make 时,要根据具体的需求和对象类型进行判断。希望本文对大家有所帮助,能够更加深入地理解和应用 new 和 make 函数。感谢阅读!

以上就是一文教你使用new和make构建Golang应用的详细内容,更多关于使用new和make构建Golang应用的资料请关注软件开发网其它相关文章!



golang new make

需要 登录 后方可回复, 如果你还没有账号请 注册新账号