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

声明切片还是制作切片?

声明切片还是制作切片?

Go
繁花不似锦 2021-08-10 21:10:50
在 Go 中,var s []int和之间有什么区别s := make([]int, 0)?我发现两者都有效,但哪个更好?
查看完整描述

4 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

除了fabriziom的回答之外,您还可以在“ Go Slices: usage and internals ”中看到更多示例,其中[]int提到了用于:


由于 slice ( nil)的零值就像一个零长度 slice,您可以声明一个 slice 变量,然后在循环中附加到它:


// Filter returns a new slice holding only

// the elements of s that satisfy f()

func Filter(s []int, fn func(int) bool) []int {

    var p []int // == nil

    for _, v := range s {

        if fn(v) {

            p = append(p, v)

        }

    }

    return p

}

这意味着,要附加到切片,您不必先分配内存:nil切片p int[]足以作为要添加的切片。


查看完整回答
反对 回复 2021-08-10
?
ibeautiful

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

简单的声明

var s []int

不分配内存并s指向nil,而

s := make([]int, 0)

分配内存并将s内存指向具有 0 个元素的切片。

通常,如果您不知道用例的确切大小,则第一个更惯用。


查看完整回答
反对 回复 2021-08-10
?
呼唤远方

TA贡献1856条经验 获得超11个赞

更完整一点(在 中还有一个论点make)示例:


slice := make([]int, 2, 5)

fmt.Printf("length:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

出去:


length:  2 - capacity 5 - content:  [0 0]

或者使用动态类型slice:


slice := make([]interface{}, 2, 5)

fmt.Printf("length:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

出去:


length:  2 - capacity 5 - content:  [<nil> <nil>]


查看完整回答
反对 回复 2021-08-10
  • 4 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

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