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语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

$在R语言中的作用示例小结

《$在R语言中的作用示例小结》在R语言中,$是一个非常重要的操作符,主要用于访问对象的成员或组件,它的用途非常广泛,不仅限于数据框(dataframe),还可以用于列表(list)、环境(enviro... 目录1. 访问数据框(data frame)中的列2. 访问列表(list)中的元素3. 访问jav

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服