go语言中make和new有什么作用以及区别?
在Go语言中,make 和 new 是两个内置的函数(built-in functions),用于分配内存,但它们之间有显著的区别,主要体现在它们被用于不同类型的对象分配内存。
new
new关键字用于分配内存。更确切地说,它分配了零值初始化的内存空间,并返回指向这个新分配类型的指针。它只用于内建的数据类型(如int、float64、struct等),或者任何类型的指针、切片、映射、通道、函数等类型。但是,new 不会为切片、映射或通道初始化内部数据结构,只会分配一个指向这些类型的零值的指针。
new 函数接受一个类型 Type 作为参数,并返回一个指向该类型新分配零值的指针 *Type。
语法如下:
# 完整语法
var ptr *Type = new(Type)
# 简写
ptr := new(Type)
这里的 Type 是一个类型, 变量 ptr 是一个指向该类型零值内存地址的指针。
实际编程中,通常我们会采用简写形式。
举个栗子,如下所示:
var ptr *int = new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2
也可以简写成
ptr := new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2
make
make 函数用于初始化内置的数据结构类型:切片(slice)、映射(map)和通道(channel)。它不仅分配了内存,还返回了初始化(非零)后的(内建的)值。
例如,对于切片,它返回了一个长度和容量都已初始化的切片;对于映射,它返回了一个空的映射(准备好接受键值对);
对于通道,它返回了一个可以进行通信的通道。
如下所示
slice := make([]Type, len, cap)
map := make(map[KeyType]ValueType)
channel := make(chan Type, capacity)
- []Type 表示切片的元素类型。
- len 是切片的长度。
- cap 是切片的容量(可选,默认为长度)。
- KeyType 是映射的键的类型。
- ValueType 是映射的值的类型。
- Type 是通道中元素的类型。
- capacity 是通道的容量(可选,对于无缓冲通道,容量为0)。
区别
- 用途:
new用于分配任意类型的内存空间,并返回指向该空间的指针,它不会初始化内存;make用于初始化切片、映射、通道等内建的数据结构类型。 - 返回值:
new返回的是一个指向类型的指针;make返回的是初始化后的(内建的)值,比如切片、映射或通道。 - 零值:
new分配的类型被零值初始化;make初始化的切片、映射和通道则不是零值,它们有特定的初始状态(比如,切片的长度和容量,空的映射,可以通信的通道)。 - 适用类型:
new适用于所有类型;make只适用于切片、映射和通道。
go语言中make和new有什么作用以及区别?的更多相关文章
- C语言中的system函数参数及其作用
函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用 system() ...
- c语言中%s与%c对读入字符串的区别
对于scanf函数,需求%s类型时,\n是不会影响scanf内容的对于需求%c类型时,\n也是字符,自然会有影响.
- 汇编语言中,SP,BP ,SI,DI作用?
这个很简单: sp:表示栈顶指针,指向栈顶地址.与SS相配合使用.ss为栈段. bp:是基址指针,段地址默认在SS中.可以定位物理地址,比如:"mov ax,[bp+si+6]/mov ax ...
- c语言中break continue goto return和exit的区别 联系(筛选奇数和goto求和)
break 一般你是用于循环和switch语句中,执行break,退出循环,如果是多层循环,那么退出的当前的循环. 如果循环结构中有switch语句,而switch语句中有break 那么不会直接退出 ...
- c语言中malloc realloc 和calloc的联系与区别
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...
- models语言中filter和all取数据有什么区别
转自:http://www.bubuko.com/infodetail-1882394.html rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数 ...
- 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别
printf语法: #include <stdio.h>int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式 ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
- c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
随机推荐
- 隐藏zsh前面用户名或者主机名
1. zshrc 修改 vim ~/.zshrc文件,在文件底部增加: prompt_context() {} 只保留用户名,隐藏主机名 prompt_context() { if [[ " ...
- Solution Set -「AGC 001~003」C~F
目录 「AGC 001C」Shorten Diameter 「AGC 001D」Arrays and Palindrome * 「AGC 001E」BBQ Hard * 「AGC 001F」Wild ...
- Flutter的一些概念(二)
注:本文同步发布于微信公众号:stringwu的互联网杂谈 Flutter的一些概念(二) 1 flutter的核心渲染模块 当应用启动时flutter 会遍历所有的Widget 形成Widget 树 ...
- NoSQL和SQL的区别、使用场景与选型比较
什么是NoSQL NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,它具有非关系型.分布式.不提供ACID的数 ...
- TCP的网络编程基础
服务器建立 ServerSocket 对象ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员.也就是说, 服务器必须事先建立一个等待客户请求建立套接字的 连接 ...
- C#中的内部函数(子函数)
private bool GetMedicalAdvice(string zyID, out DataTable dtM, out DataTable dtD) { bool result = fal ...
- 深入理解 Future, CompletableFuture, ListenableFuture,回调机制
深入理解 Future, CompletableFuture, ListenableFuture,回调机制 本文禁止转载. 本文从设计思想.具体实现等角度分析了 Future.CompletableF ...
- mount命令及挂载本地yum源
mount命令 mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类 ...
- 解锁DeepSeek深度应用,天翼云GPU云主机强势破局!
在人工智能重塑世界的当下,一场影响深远的科技变革正在悄然上演,DeepSeek系列模型在诸多领域掀起热潮.企业级AI模型的训练与部署,不仅是技术的角力场,更是决定企业兴衰的生死线.每一次算法的迭代革新 ...
- Typora Emoji图标
转自: https://www.cnblogs.com/wangjs-jacky/p/12011208.html People :smile: :laughing: :blush: :sm ...