聊聊Go语言中new和make关键字有什么区别

本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是 new 和 make 这两个内置函数的区别。

聊聊Go语言中new和make关键字有什么区别

其实这个问题本身并不复杂,简单来说就是,new 只分配内存,而 make 只能用于 slice、map 和 chan 的初始化,下面我们就来详细介绍一下。

new

new 是一个内置函数,它会分配一段内存,并返回指向该内存的指针。

其函数签名如下:

立即学习“go语言免费学习笔记(深入)”;

源码

// The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.func new(Type) *Type

登录后复制

从上面的代码可以看出,new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。

同时 new 函数会把分配的内存置为零,也就是类型的零值。

使用

使用 new 函数为变量分配内存空间:

p1 := new(int)fmt.Printf("p1 --> %#v  ", p1) //(*int)(0xc42000e250) fmt.Printf("p1 point to --> %#v  ", *p1) //0var p2 *inti := 0p2 = &ifmt.Printf("p2 --> %#v  ", p2) //(*int)(0xc42000e278) fmt.Printf("p2 point to --> %#v  ", *p2) //0

登录后复制

上面的代码是等价的,new(int) 将分配的空间初始化为 int 的零值,也就是 0,并返回 int 的指针,这和直接声明指针并初始化的效果是相同的。

当然,new 函数不仅能够为系统默认的数据类型分配空间,自定义类型也可以使用 new 函数来分配空间,如下所示:

type Student struct {   name string   age int}var s *Students = new(Student) //分配空间s.name = "zhangsan"fmt.Println(s)

登录后复制

这就是 new 函数,它返回的永远是类型的指针,指针指向分配类型的内存地址。需要注意的是,new 函数只会分配内存空间,但并不会初始化该内存空间。

make

make 也是用于内存分配的,但是和 new 不同,它只用于 slice、map 和 chan 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型。因为这三种类型本身就是引用类型,所以就没有必要返回他们的指针了。

其函数签名如下:

立即学习“go语言免费学习笔记(深入)”;

源码

// The make built-in function allocates and initializes an object of type// slice, map, or chan (only). Like new, the first argument is a type, not a// value. Unlike new, make's return type is the same as the type of its// argument, not a pointer to it. The specification of the result depends on// the type:// Slice: The size specifies the length. The capacity of the slice is// equal to its length. A second integer argument may be provided to// specify a different capacity; it must be no smaller than the// length, so make([]int, 0, 10) allocates a slice of length 0 and// capacity 10.// Map: An empty map is allocated with enough space to hold the// specified number of elements. The size may be omitted, in which case// a small starting size is allocated.// Channel: The channel's buffer is initialized with the specified// buffer capacity. If zero, or the size is omitted, the channel is// unbuffered.func make(t Type, size ...IntegerType) Type

登录后复制

通过上面的代码可以看出 make 函数的 t 参数必须是 slice、map 和 chan 中的一个,并且返回值也是类型本身。

使用

下面用 slice 来举一个例子:

var s1 []intif s1 == nil {    fmt.Printf("s1 is nil --> %#v  ", s1) // []int(nil)}s2 := make([]int, 3)if s2 == nil {    fmt.Printf("s2 is nil --> %#v  ", s2)} else {    fmt.Printf("s2 is not nill --> %#v  ", s2)// []int{0, 0, 0}}

登录后复制

slice 的零值是 nil,但使用 make 初始化之后,slice 内容被类型 int 的零值填充,如:[]int{0, 0, 0}。

map 和 chan 也是类似的,就不多说了。

总结

通过以上分析,总结一下 new 和 make 主要区别如下:

make 只能用来分配及初始化类型为 slice、map 和 chan 的数据。new 可以分配任意类型的数据;

new 分配返回的是指针,即类型 *Type。make 返回类型本身,即 Type;

new 分配的空间被清零。make 分配空间后,会进行初始化;

推荐学习:《go视频教程》

以上就是聊聊Go语言中new和make关键字有什么区别的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2413732.html

(0)
上一篇 2025年3月3日 00:15:30
下一篇 2025年2月23日 10:11:26

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • golang能做什么

    golang,或者叫做go语言,是一种开源的编程语言。与python、java、c++等一样,golang也有着自己的优点和特点。在当前互联网发展迅速的背景下,golang已经被越来越多的开发者所认可和使用。那么,golang能够做什么呢?…

    编程技术 2025年3月3日
    200
  • 浅析centos上怎么安装golang

    centos是一款非常流行的linux发行版,它被广泛用于服务器、桌面电脑、虚拟机等各种场景。而golang是google推出的一门编程语言,被广泛应用于后端服务开发、云计算、大数据处理等领域。 在本篇文章中,我们将会介绍如何在CentOS…

    编程技术 2025年3月3日
    200
  • golang中怎么进行类型转换

    golang(go)是一种编程语言,最近在开发实践中越来越受欢迎,特别是在web和分布式系统应用程序开发方面。在go中,类型转换是一种将一个数据类型转换为另一个类型的过程。本文将探讨golang中的类型转换,包括其语法,用法和注意事项。 语…

    编程技术 2025年3月3日
    200
  • golang 转ascii

    golang转ascii: 一种快速而简单的方法 Golang是一种简单而高效的编程语言,得到了广泛的应用。在某些情况下,您可能需要将字符串转换为ASCII格式,以在网络上使用它们。以下是一种快速而简单的方法来达到这个目的。 首先,您需要决…

    编程技术 2025年3月3日
    200
  • golang 中文乱码怎么办

    golang是一种流行的编程语言,也被称为go语言。它是由google开发的一种开源项目,其简洁的语法和高效的并发性能得到了许多开发人员的青睐。但是,在使用golang进行开发的过程中,开发者可能会遇到中文乱码问题。这个问题可能会导致显示异…

    编程技术 2025年3月3日
    200
  • golang mac是怎么安装的

    golang是一种简单、快速、安全且具有高效并发的程序设计语言。它可以在各种操作系统上使用,包括macos。在本篇文章中,我们将讨论如何在macos上安装golang。 一、下载Golang在开始安装之前,需要从https://golang…

    编程技术 2025年3月3日
    200
  • 聊聊mac golang 安装方法

    在本文中,我们将探讨如何在mac操作系统下安装golang。 Golang是一种快速、高效、可靠的编程语言,由Google开发和维护。它被广泛应用于网络开发、系统编程、云计算等领域,具有语法简洁、可移植、并发性强等特点。 对于Mac用户而言…

    编程技术 2025年3月3日
    200
  • 分析golang指针转换

    go语言(golang)是一门静态类型的编程语言。它源于搜索引擎巨头谷歌(google)的内部项目,于2009年首次亮相,并在2012年开源释放。随着时代的变迁,go语言逐渐成为了一门备受推崇的编程语言,它的特点之一就是对指针的处理非常清晰…

    编程技术 2025年3月3日
    200
  • centos7 怎么安装golang

    golang是一种高性能、跨平台的编程语言,被广泛应用于web开发、云计算、大数据等领域。作为一名linux系统管理员,了解如何在centos 7系统上安装和配置golang是非常有必要的。在本文中,我们将介绍如何在centos 7系统上安…

    编程技术 2025年3月3日
    200
  • 聊聊golang byte转string方法

    go语言是一门注重效率的编程语言,它的速度和性能优势是其他编程语言所不能比拟的。其中,将byte类型转化成string类型常常用于编写网络编程、加密解密等应用场景。 在Go语言中,byte是一种表示8位整型数据的数据类型,它在一些场景下常常…

    编程技术 2025年3月3日
    200

发表回复

登录后才能评论