Go语言nil概念,make与new的区别

2024-05-01 14:28
文章标签 语言 go 概念 区别 make nil new

本文主要是介绍Go语言nil概念,make与new的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

nil

在Go语言中,nil 是一种特殊值,主要用于指针、接口、切片、映射、通道这五种引用类型。与其它类型的默认值(零值)有着显著的区别:

  1. nil

    • nil 表示没有具体的值或不存在的对象引用。它可以赋值给指针、切片、映射、通道和接口类型。
    • 当一个指针变量被赋予 nil 时,它不再指向任何内存地址。
    • 当切片、映射或通道被赋予 nil 时,它们是未初始化的状态,不能进行任何操作(如访问、插入元素等),否则会导致 panic。
    • 接口变量被赋予 nil 时,表示接口没有任何具体类型实现。
    • nil标识符不能用来做比较。
    • 不同类型的 nil 是不能比较的。

    • 两个相同类型的 nil 值也可能无法比较。

    • 不同类型的 nil 值占用的内存大小可能是不一样的

  2. 其他类型默认值(零值)

    • 基本类型(如整型、浮点型、布尔型、字符串等):它们的零值分别是整数0、浮点数0.0、布尔值 false 和空字符串 ""
    • 结构体、数组和复合类型:它们的成员变量或元素都将被初始化为各自类型的零值。
    • 函数类型:函数类型的零值是 nil,但这个 nil 指的是函数指针没有指向任何函数,而不是函数本身具有一个特殊的值。

总结起来,nil 与非引用类型默认值(零值)的主要区别在于:

  • nil 仅针对特定类型的变量,且表示没有有效对象或者未初始化的状态。
  • 其他类型(尤其是非引用类型)的默认值是固定的、明确的初始值,这些值是类型固有的,并且可以被正常使用的(尽管可能是无效的业务状态,如空字符串仍然可以作为字符串使用,只是不包含任何字符)。

new 函数

  1. 功能new 函数用于分配指定类型的新实例,并将其初始化为其零值。它返回的是一个指向新分配类型值的指针。
  2. 语法new(T),其中 T 是你想要分配的类型。
  3. 应用范围new 可以用于任何类型,包括但不限于结构体、数组、指针、基本类型等。
  4. 返回值:返回的是指向新分配内存的指针,类型为 *T
  5. 内存初始化:分配的内存区域都会被清零,即包含的值为相应类型的零值。

make 函数

  1. 功能make 函数专门用于初始化并返回三种特殊的引用类型:切片(slice)、映射(map)和通道(channel)。它不仅分配内存,还会做额外的初始化工作,这些类型在使用前必须经过初始化,不能直接使用 new 函数。
    • 对于切片,make 会分配底层数组的内存,并初始化切片结构体,包括长度和容量信息。
    • 对于映射,make 初始化一个空的映射哈希表。
    • 对于通道,make 初始化一个通信信道,可以设定缓冲区大小。
  2. 语法make(T, args...),这里的 T 必须是 slice、map 或 channel 类型,args... 根据不同类型的初始化要求提供额外参数(如切片的长度和容量,或通道的缓冲大小)。
  3. 返回值:返回的是初始化完成后的 slice、map 或 channel 类型自身,而不是它们的指针。
  4. 内存初始化:make 不仅仅是分配内存,还会根据不同的类型进行相应的初始化过程,对于映射和通道,它们内部的数据结构会准备好用于存放元素和执行通信。

总结:

  • 使用 new 主要是为任意类型分配内存并初始化为零值,然后返回指向该内存的指针。
  • 使用 make 仅限于初始化切片、映射和通道,并完成这些类型特有的初始化过程,以便能够正常使用它们的特性和功能。

这篇关于Go语言nil概念,make与new的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951925

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时