go - 如何以惯用的方式预分配和填充一片指针?

标签 go slice

http://play.golang.org/p/j-Y0mQzTdP

package main

import "fmt"

type UselessStruct struct {
    a int
    b int
}

func main() {
    mySlice := make([]*UselessStruct, 5)
    for i := 0; i != 5; i++ {
        mySlice = append(mySlice, &UselessStruct{})
    }

    fmt.Println(mySlice)
}

输出:[<nil> <nil> <nil> <nil> <nil> 0xc010035160 0xc010035170 0xc010035180 0xc010035190 0xc0100351a0]

我想做的是为 5 个无用结构预分配内存,存储为指针。如果我声明一个结构值 eq:

mySlice := make([]UselessStruct, 5)

然后这会创建 5 个空结构 - 追加不会替换空结构,而是继续添加到 slice 中,因此最终结果是以下代码:

http://play.golang.org/p/zBYqGVO85h

package main

import "fmt"

type UselessStruct struct {
    a int
    b int
}

func main() {
    mySlice := make([]UselessStruct, 5)
    for i := 0; i != 5; i++ {
        mySlice = append(mySlice, UselessStruct{})
    }

    fmt.Println(mySlice)
}

是:[{0 0} {0 0} {0 0} {0 0} {0 0} {0 0} {0 0} {0 0} {0 0} {0 0}]

预分配和填充 slice 的惯用方式是什么?

最佳答案

对于你的第一个例子,我会这样做:

mySlice := make([]*UselessStruct, 5)
for i := range mySlice {
     mySlice[i] = new(UselessStruct)
}

您在这两个示例中面临的问题是您要附加到一个已经是正确长度的 slice 。如果您设置 mySlice := make([]*UselessStruct, 5),您要求的是长度为 5 的 nil 指针 slice 。如果附加一个指针,它现在的长度为 6。

相反,您想使用 mySlice := make([]*UselessStruct, 0, 5)。这会创建一个长度为 0 但容量为 5 的 slice 。每次追加时,它都会在长度上加一,但在超过 slice 的容量之前它不会重新分配。

mySlice := make([]*UselessStruct, 0, 5)
for i := 0; i != 5; i++ {
    mySlice = append(mySlice, &UselessStruct{})
}
// mySlice is [0xc010035160 0xc010035170 0xc010035180 0xc010035190 0xc0100351a0]

我的两个示例都将按您的预期工作,但出于纯粹的风格原因,我推荐第一个示例。

关于go - 如何以惯用的方式预分配和填充一片指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906113/

相关文章:

go - golang.org 包和标准库的区别

arrays - OCaml 数组切片?

python - 使用张量数组时 SymPy 中的类型错误

csv - 如何在不复制的情况下在 Rust 中迭代 Vec 时分配切片?

arrays - 为什么字节 slice 的元素在 Go 中以整数形式返回?

http - 重定向返回 http : multiple response. WriteHeader 调用

go - 如何在GO中测试TCP断开连接

multithreading - Go 运行时使用的线程数

go - 用于调用指针方法的语法

html - 制作 flex 阴影的最佳方法