
在Go语言中,make和new是两个常用的函数,用于创建变量或数据结构。它们的使用方法和作用有一些区别,下面将详细介绍它们的使用和区别,并给出一些可能在面试中遇到的坑。
make函数用于创建切片、映射和通道等引用类型的数据结构。它的语法如下:
scss 体验AI代码助手 代码解读复制代码make(T, size)其中,T表示切片、映射或通道的类型,size表示长度或容量。
示例1:创建一个长度为5,容量为10的整型切片
go 体验AI代码助手 代码解读复制代码slice := make([]int, 5, 10)示例2:创建一个长度为0,容量为5的整型切片
go 体验AI代码助手 代码解读复制代码slice := make([]int, 0, 5)示例3:创建一个长度为0,容量为5的映射
go 体验AI代码助手 代码解读复制代码m := make(map[string]int, 5)示例4:创建一个容量为10的整型通道
go 体验AI代码助手 代码解读复制代码ch := make(chan int, 10)make函数返回的是一个初始化后的(非零值)引用类型变量,即返回的是一个指向新分配的对象的指针。
new函数用于创建指定类型的零值对象,并返回该对象的指针。它的语法如下:
scss 体验AI代码助手 代码解读复制代码new(T)其中,T表示要创建的类型。
示例1:创建一个整型变量的指针
dart 体验AI代码助手 代码解读复制代码var num *int
num = new(int)示例2:创建一个结构体变量的指针
go 体验AI代码助手 代码解读复制代码type Point struct {
X, Y int
}
var p *Point
p = new(Point)示例3:创建一个字符串变量的指针
csharp 体验AI代码助手 代码解读复制代码var str *string
str = new(string)new函数返回的是一个指向新分配的零值对象的指针。
在面试中,可能会遇到以下坑:
比如说以下面试题:
go 体验AI代码助手 代码解读复制代码// 使用make函数创建切片 slice := make([]int, 5, 10) fmt.Println(slice) // [0 0 0 0 0] // 使用new函数创建切片 ptr := new([]int) fmt.Println(ptr) // &[]
go 体验AI代码助手 代码解读复制代码// 使用make函数创建映射 m := make(map[string]int) m["a"] = 1 fmt.Println(m) // map[a:1] // 使用new函数创建映射 ptr := new(map[string]int) *ptr = make(map[string]int) (*ptr)["b"] = 2 fmt.Println(*ptr) // map[b:2]
go 体验AI代码助手 代码解读复制代码// 使用make函数创建通道 ch := make(chan int, 5) ch <- 1 fmt.Println(<-ch) // 1 // 使用new函数创建通道 ptr := new(chan int) *ptr = make(chan int) *ptr <- 2 fmt.Println(<-*ptr) // 2
go 体验AI代码助手 代码解读复制代码// 使用new函数创建结构体变量的指针 type Person struct { Name string Age int } ptr := new(Person) fmt.Println(ptr) // &{ 0}
make和new是Go语言中常用的函数,用于创建变量或数据结构。make函数用于创建切片、映射和通道等引用类型的数据结构,返回的是一个初始化后的引用类型变量的指针;而new函数用于创建任意类型的变量,返回的是一个指向新分配的零值对象的指针。在面试中,要注意区分它们的使用场景和区别,并准备好相关的面试题。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。