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个无用的指令预先分配内存,存储为指针.如果我声明一个 struct 值片段:

mySlice := make([]UselessStruct, 5)

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

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}]

What is the the go-idiomatic way to preallocate and fill slices?

推荐答案

对于您的第一个示例,我将执行以下操作:

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

在这两个例子中,您都面临的问题是,您正在附加一个已经是正确长度的切片.如果设置为mySlice := make([]*UselessStruct, 5),则需要长度为5的零指针切片.如果附加一个指针,它现在的长度为6.

相反,您希望使用mySlice := make([]*UselessStruct, 0, 5).这将创建一个长度为0但容量为5的切片.每次追加时,它都会在长度上增加1,但在超出该切片的容量之前,它不会重新分配.

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

我的两个示例都会像您预期的那样工作,但我推荐第一个示例纯粹是出于风格方面的原因.

Go相关问答推荐

语法-for循环中的initit陈述是否允许分配?

Pulumi-S3-当策略依赖于访问点时,如何将AccesspintPolicy附加到访问点

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

GORM Find方法中缺少字段

GO框架Echo中间件的使用

使用 OpenTelemetry 统一不同服务的范围

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

更改多对多连接表的名称

Gremlin-Go:树步骤不可序列化

不能使用 mockDB(*MockDB 类型的变量)作为 struct 文字中的 *gorm.DB 值

如何仅提取时间作为持续时间

为什么当我忽略 template.New() 程序可以成功运行?

使用 AppID 在 Windows 中启动应用程序并获取 pid

每 N 秒运行一次函数,上下文超时

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?

在 golang 中联合一个接口和类型

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

go mod tidy 错误消息:但是 go 1.16 会 Select

Go generics:我会在哪里使用 any 而不是 interface{}?

comparable和any有什么区别?