为了账号安全,请及时绑定邮箱和手机立即绑定

初始化空切片的正确方法

初始化空切片的正确方法

Go
慕妹3242003 2021-09-21 22:16:38
要声明一个具有非固定大小的空切片,最好这样做:mySlice1 := make([]int, 0)或者:mySlice2 := []int{}只是想知道哪个是正确的方法。
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

它们是等价的。看到这个代码:


mySlice1 := make([]int, 0)

mySlice2 := []int{}

fmt.Println("mySlice1", cap(mySlice1))

fmt.Println("mySlice2", cap(mySlice2))

输出:


mySlice1 0

mySlice2 0

两个切片都有0容量,这意味着两个切片都有0长度(不能大于容量),这意味着两个切片都没有元素。这意味着 2 个切片在各个方面都是相同的。


查看完整回答
反对 回复 2021-09-21
?
绝地无双

TA贡献1946条经验 获得超4个赞

作为@ANisus回答的补充...


以下是“Go in action”一书中的一些信息,我认为值得一提:


nil&empty切片的区别

如果我们考虑这样的切片:


[pointer] [length] [capacity]

然后:


nil slice:   [nil][0][0]

empty slice: [addr][0][0] // points to an address

零切片

当您想要表示一个不存在的切片时,它们很有用,例如在返回切片的函数中发生异常时。


// Create a nil slice of integers.

var slice []int

空切片

当您想要表示一个空集合时,例如当数据库查询返回零结果时,空切片很有用。


// Use make to create an empty slice of integers.

slice := make([]int, 0)


// Use a slice literal to create an empty slice of integers.

slice := []int{}

不管您使用的是零片或空片,内置的功能append,len和cap工作一样。


去游乐场示例:


package main


import (

    "fmt"

)


func main() {


    var nil_slice []int

    var empty_slice = []int{}


    fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))

    fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))


}

印刷:


true 0 0

false 0 0


查看完整回答
反对 回复 2021-09-21
  • 3 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信