go - 什么时候使用 make vs 内联 slice 初始化器?

标签 go slice

考虑以下两段代码:

// Declaring the values inline.
os_list := []string{"Mac OSX", "Linux", "Windows 7"}
fmt.Println(os_list)

// Appending them to an empty slice.
os_list_two := make([]string, 3)
os_list_two = append(os_list_two, "Mac OSX", "Linux", "Windows 7")
fmt.Println(os_list_two)

我们什么时候应该使用其中之一?

最佳答案

make 将为字符串 slice 分配和初始化内存。在您的示例中,os_list_two 在索引 0-2 处包含三个空字符串,后跟项目“Mac OSX”、“Linux”、“Windows 7”。最后,您得到了一个包含六个元素的 slice ,而不是您可能预期的三个。

你可以在这里看到它的插图:
http://play.golang.org/p/Vm92dz8LqF

关于 make 的更多信息:
http://golang.org/ref/spec#Making_slices_maps_and_channels

在 slice 上:
http://blog.golang.org/go-slices-usage-and-internals

如果您事先知道需要多大的 slice ,或者需要在特定位置对 slice 进行索引,或者如果零值在某种程度上对您有用,请使用 make。如果您只需要一个 slice 来附加项目,您可以简单地使用 []string{} 来定义它。如果您需要使用特定值初始化 slice ,那么不使用 make 也是有意义的,就像您对 os_list 所做的那样。

关于go - 什么时候使用 make vs 内联 slice 初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481491/

相关文章:

python - NumPy 2d 数组的切片,或者如何从 nxn 数组 (n>m) 中提取 mxm 子矩阵?

go - SetWriteDeadline 错误解读

golang linter 总是提示

go - 无法获得环境值(value)

go - 选择仅从一个 channel 打印输出

go - 成功删除 stringutil.a 但它会自行恢复

go - 如何使用附加删除 slice 元素?

pointers - []struct{} 和 []*struct{} 有什么区别?

python - 通过切片了解字符串反转

python - 根据输入对大列表进行切片