Go基础面试题, Go 语言的零切片,空切片和 nil 切片是什么?有什么区别?
Go基础面试题, Go 语言的零切片,空切片和 nil 切片是什么?有什么区别?
QA
Step 1
Q:: Go 语言的零切片、空切片和 nil 切片是什么?有什么区别?
A:: 在 Go 语言中,切片(slice)是一种灵活且功能强大的数据结构。零切片(zero slice)是指一个长度为 0 的切片,其底层数组为 nil;空切片(empty slice)是指一个长度为 0 的切片,其底层数组已分配,但没有元素;nil 切片是一个长度和容量都为 0
的切片,并且底层数组为 nil。nil 切片和空切片在使用上有一些微妙的区别,特别是在 JSON 序列化和数据库操作中。
Step 2
Q:: Go 中如何判断一个切片是否为 nil?
A:: 可以通过比较切片是否等于 nil 来判断是否为 nil 切片,例如 if slice == nil
。需要注意的是,空切片和 nil 切片在内存中是不同的,虽然它们的长度和容量都是 0
,但空切片的底层数组是已经分配的,而 nil 切片没有分配底层数组。
Step 3
Q:: 在 Go 中,如何优雅地处理切片扩容?
A:: Go 中的切片会在需要时自动扩容,这背后的原理是 Go 会自动为切片分配新的、更大的底层数组,并将旧数组中的数据复制到新的数组中。在手动扩容时,可以通过 append
函数来追加元素。如果你明确知道新切片的容量,最好通过 make
函数来创建一个带有指定容量的切片,这样可以减少内存分配的次数,提高性能。
Step 4
Q:: 为什么在 Go 中推荐使用 len(slice)
而不是 cap(slice)
来判断切片是否为空?
A:: len(slice)
返回的是切片中实际包含的元素个数,而 cap(slice)
返回的是切片的容量。判断切片是否为空时,应该关注的是切片中是否有元素,而不是它的容量,因此应该使用 len(slice)
来判断。如果 len(slice) == 0
,则切片为空。
Step 5
Q:: 如何在 Go 中安全地截取一个切片?
A:: 在 Go 中,切片截取时需要确保截取范围的合法性,即 slice[low:high]
中的 low
和 high
索引必须满足 0 <= low <= high <= len(slice)
。如果不满足这个条件,会引发运行时错误。因此在进行切片截取操作时,通常需要先检查这些索引是否有效。