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

一个 nil 切片和空切片的定义如下

var s1 []int   // nil切片
s2 := []int{} // 空切片,或者用 make([]int,0

好了,不能再多说了,再多说答案就出来了,接下来直接看问题。

问题

nil切片和空切片一样吗?如果不一样区别是什么,先看下下面这个描述问题的代码。

package mainimport ("fmt""reflect""unsafe"
)func main() {var s1 []ints2 := make([]int,0)s4 := make([]int,0)fmt.Printf("s1 pointer:%+v, s2 pointer:%+v, s4 pointer:%+v, \n", *(*reflect.SliceHeader)(unsafe.Pointer(&s1)),*(*reflect.SliceHeader)(unsafe.Pointer(&s2)),*(*reflect.SliceHeader)(unsafe.Pointer(&s4)))fmt.Printf("%v\n", (*(*reflect.SliceHeader)(unsafe.Pointer(&s1))).Data==(*(*reflect.SliceHeader)(unsafe.Pointer(&s2))).Data)fmt.Printf("%v\n", (*(*reflect.SliceHeader)(unsafe.Pointer(&s2))).Data==(*(*reflect.SliceHeader)(unsafe.Pointer(&s4))).Data)
}

nil切片和空切片指向的地址一样吗?这个代码会输出什么?

怎么答

  • nil切片和空切片指向的地址不一样。nil空切片引用数组指针地址为0(无指向任何实际地址)

  • 空切片的引用数组指针地址是有的,且固定为一个值

s1 pointer:{Data:0 Len:0 Cap:0}, s2 pointer:{Data:824634207952 Len:0 Cap:0}, s4 pointer:{Data:824634207952 Len:0 Cap:0},
false //nil切片和空切片指向的数组地址不一样
true  //两个空切片指向的数组地址是一样的,都是824634207952

解释

  • 之前在前面的文章里提到过切片的数据结构为

type SliceHeader struct {Data uintptr  //引用数组指针地址Len  int     // 切片的目前使用长度Cap  int     // 切片的容量
}
  • nil切片和空切片最大的区别在于指向的数组引用地址是不一样的

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

本篇面试题解,转载自公众号「小白debug」,如果喜欢它的文章内容,可以点击下方名片关注。

Go的nil切片与空切片一样吗?这么答,面试官让回去等信儿相关推荐

  1. Go 学习笔记(11)— 切片定义、切片初始化、数组和切片差异、字符串和切片转换、len()、cap()、空 nil 切片、append()、copy() 函数、删除切片元素

    1. 切片定义 Go 语言切片是对数组的抽象. Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容 ...

  2. golang nil切片与空切片

    var slice []int 创建出来的 slice 其实是一个 nil slice.它的长度和容量都为0.和nil比较的结果为true.这里比较混淆的是empty slice,empty slic ...

  3. 2.4 Go语言基础之切片

    本文主要介绍Go语言中切片(slice)及它的基本使用. 一.引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x [3]int) ...

  4. 深度解密Go语言之Slice

    Go 语言的 slice 很好用,不过也有一些坑.slice 是 Go 语言一个很重要的数据结构.网上已经有很多文章写过了,似乎没必要再写.但是每个人看问题的视角不同,写出来的东西自然也不一样.我这篇 ...

  5. 深入解析 Go 中 Slice 底层实现

    转载地址:https://mp.weixin.qq.com/s/8b6FudzXStKN3d6p8wYSqQ 切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合.切片的设计想法是由 ...

  6. 一位 Rust 开发者的 Go 初体验

    作者 | Nick Cameron 责编 | 郭芮 过去几周,我一直在用 Go 语言编写程序.这是我首次在大型且重要的项目中使用 Go.在研究 Rust 的特性时,我也看了很多关于 Go 的内容,包括 ...

  7. 《Go语言圣经》笔记

    文件组成 特点: Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译) Go语言原生支持Unicode,它可以处理全世界任何语言的文本 组成: 通过包(pac ...

  8. 2023版golang面试题100道(slice)

    面试题合集目录 整型切片如何初始化? s1 := make([]int, 0) s2 := make([]int, 5, 10) s3 := []int{1, 2, 3} nil切片和空切片指向的地址 ...

  9. 面试笔记二(总结的答案可能有误,感谢批评指正)

    持续更新中-- 好好住 golang实习生 一百多人小厂(1~9) 跟谁学一面(10~16) 好好住 golang实习生 一百多人小厂(1~9): 1.mysql主从复制怎么实现?   笔者把这个问题 ...

最新文章

  1. numpy.loadtxt画功率谱图
  2. add svn 多个文件_深圳信狮SVN技术文档
  3. 水晶报表Crystal 语法 实用字段编辑
  4. 【Python】Python 远程连接服务器,用它就够了
  5. CentOS 初体验十五:阿里云安装Nginx
  6. vue 返回上一页传参_H5页面与微信小程序相互跳转并传参(web-view)
  7. “记录”是给世界做积极贡献的一种方式
  8. PAT乙级-1070. 结绳(25)
  9. C# 结合 Golang 开发
  10. [ZJOI2012]数列
  11. 脚手架 mixin (混入)
  12. SpringBoot通过配置文件自动加载到map中
  13. webpack4.x中使用postcss-loader、autoprefixer给CSS属性自动添加前缀
  14. SQL Server中char与nchar区别
  15. Atitit 定时器timer 总结 目录 1.1. Js定时器 window.setInterval 1 2. Java定时器 timer 1 1.1.Js定时器 window.setInter
  16. 值得收藏的50个学习C语言的源代码网站
  17. 如何手动释放Python的内存
  18. linux下XMind创建运行图标
  19. mysql密码expired_mysql密码过期的修改方法(your password has expired)
  20. linux 查看java版本

热门文章

  1. 分布式数据库中间件概念
  2. Linux设备树语法详解【转】
  3. (XGBoost)提升树入门介绍(Inrtoduction to Boosted Trees)
  4. PHP CodeBase: 求最近一个周一和上周一的日期
  5. SpringMVC+Json构建基于Restful风格的应用
  6. [android] 请求码和结果码的作用
  7. 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~二 DBContext实例中,表实体对象是怎么被加入的...
  8. netbsd配置gnome桌面
  9. JQuery 中简单的几个 类选择器 使用方法
  10. PyQt4(简单界面)