Go中的nil切片和空切片区别详解

 更新时间:2021年03月26日 09:49:29   作者:蓝色记忆  
这篇文章主要介绍了Go中的nil切片和空切片区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil。

func main() {
  var s1 []int  // nil切片
  s2 := make([]int,0) // 空切片
  s4 := make([]int,0)  // 空切片
  s5 := []int{} // 空切片
}

直接看代码,不同声明方式:使用 make() 函数生成的切片一定发生了内存分配操作,但给定开始与结束位置(包括切片复位)的切片只是将新的切片结构指向已经分配好的内存区域,设定开始与结束位置,不会发生内存分配操作。这里的内存分配我理解的就是引用数组指针地址

  • nil切片和空切片指向的地址不一样。nil空切片引用数组指针地址为0(无指向任何实际地址)
  • 空切片的引用数组指针地址是有的,且固定为一个值

我们看看切片的数据结构:

type SliceHeader struct {
 Data uintptr //引用数组指针地址
 Len int   // 切片的目前使用长度
 Cap int   // 切片的容量
}

nil切片和空切片最大的区别在于指向的数组引用地址是不一样的。

所有的空切片指向的数组引用地址都是一样的

 

 示例

 package main

import "fmt"

func main(){
 var a []int
 b:=make([]int,0)
 if a==nil{
 fmt.Println("a is nil")
 }else{
 fmt.Println("a is not nil")
 }
 if b==nil{
 fmt.Println("b is nil")
 }else{
 fmt.Println("b is not nil")
 }
}

运行结果:
a is nil
b is not nil

Process finished with exit code 0

因此:
通过var a []int创建的切片是一个nil切片
通过b:=make([]int,0)创建的是一个空切片,(底层数组为空,但底层数组指针非空)

到此这篇关于Go中的nil切片和空切片区别详解的文章就介绍到这了,更多相关Go nil切片和空切片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手带你走进Go语言之运算符解析

    手把手带你走进Go语言之运算符解析

    这篇文章主要介绍了手Go语言之运算符解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Golang Gorm实现自定义多态模型关联查询

    Golang Gorm实现自定义多态模型关联查询

    GORM 是一个流行的开源 ORM (Object-Relational Mapping) 库,专为 Go 语言设计,它简化了与 SQL 数据库的交互,GORM 封装了数据库操作,使得开发者能够通过简单的链式调用来执行 CRUD,本文给大家介绍了Golang Gorm实现自定义多态模型关联查询,需要的朋友可以参考下
    2024-11-11
  • 使用Go语言玩转 RESTful API 服务

    使用Go语言玩转 RESTful API 服务

    RESTful API是一种基于HTTP协议的API设计风格,遵循REST架构风格,这篇文章主要为大家介绍了如何通过Go语言构建RESTful API服务,有需要的可以了解下
    2025-02-02
  • 使用golang在windows上设置全局快捷键的操作

    使用golang在windows上设置全局快捷键的操作

    最近在工作中,总是重复的做事,想着自己设置一个快捷键实现windows 剪贴板的功能,所以本文小编给大家分享了使用golang在windows上设置全局快捷键的操作,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-02-02
  • Go语言实现的可读性更高的并发神库详解

    Go语言实现的可读性更高的并发神库详解

    这篇文章主要为大家介绍了Go语言实现的可读性更高的并发神库详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • golang官方嵌入文件到可执行程序的示例详解

    golang官方嵌入文件到可执行程序的示例详解

    这篇文章主要介绍了golang官方嵌入文件到可执行程序,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • go中make用法及常见的一些坑

    go中make用法及常见的一些坑

    golang分配内存主要有内置函数new和make,下面这篇文章主要给大家介绍了关于go中make用法及常见的一些坑,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • go语言net包rpc远程调用的使用示例

    go语言net包rpc远程调用的使用示例

    本篇文章主要介绍了go语言net包rpc远程调用的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Go GORM 事务详细介绍

    Go GORM 事务详细介绍

    这篇文章主要介绍了Go GORM事务详细介绍,GORM 会在事务里执行写入操作创建、更新、删除,具体详细介绍需要的朋友可以参考下面文章的简单介绍
    2022-07-07
  • Golang中匿名组合实现伪继承的方法

    Golang中匿名组合实现伪继承的方法

    这篇文章主要介绍了Golang中匿名组合实现伪继承的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论