gpt4 book ai didi

go - 新 slice 的第一个值为 nil

转载 作者:IT王子 更新时间:2023-10-29 01:55:41 25 4
gpt4 key购买 nike

我正在尝试为 Golang 中的图像大小调整服务器创建一个简单的概念验证。我是 golang 的新手,被困在这个令人沮丧的问题上。也许我没有正确理解 slice ,所以请让我在 slice 的使用中有什么错误。

我使用 request.ParseMultipartForm() 来解析发送到服务器的文件和任何 POST 参数。然后,我需要转换文件列表(它们是 map[string][]*multipart.FileHeader)。我正在使用以下代码来执行此操作。

    // convert the FileHeader map to a list of io.Readers
images := make([]io.Reader, len(reqForm.File))
fmt.Println(images)
for _, fileHeaders := range reqForm.File {
fh := fileHeaders[0]
f, err := fh.Open()
fmt.Printf("Converting: %v\n", f)
if err != nil {
writeErrorToResponse(resp, err)
return
}

images = append(images, f)
}

我的问题是,由于某种原因,images 最终有一个 nil,因为它是 make 初始化后的第一个值。我知道这一点是因为 fmt.Println(images)(代码行 2)打印出:

[<nil>]

我假设 make 会返回一个包含零个元素的 slice 。如果我改为执行 make([]io.Reader, 0),它会按预期工作。我对这种行为感到困惑,解释会很有帮助。

最佳答案

images := make([]io.Reader, len(reqForm.File)) 创建给定长度和相同容量的 slice 。当您稍后 append 时,新值将放在末尾。

您可以通过两种方式解决此问题:

  • 以长度 0 开始,但给定的容量为 images := make([]io.Reader, 0, len(reqForm.File))
  • 从一个空 slice 开始,然后允许 append 使其自然增长。 var images []io.Reader.

我会选择后者,因为它稍微简单一些,如果后来发现这是一个瓶颈,我会用预分配的 slice 替换它。

关于go - 新 slice 的第一个值为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com