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

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使