何时使用make vs inline slice初始化程序?

时间:2013-12-09 21:47:17

标签: 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)

我们应该何时使用其中一种?

2 个答案:

答案 0 :(得分:10)

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

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

有关make的更多内容:
http://golang.org/ref/spec#Making_slices_maps_and_channels

关于切片:
http://blog.golang.org/go-slices-usage-and-internals

如果您事先知道需要多大的切片,或者需要在特定位置索引切片,或者零值对您有用,则使用make。如果您只需要一个切片来附加项目,您可以使用[]string{}来定义它。如果您需要使用特定值初始化切片,也可以不使用make,就像您对os_list所做的那样。

答案 1 :(得分:-2)

这两组陈述具有完全相同的效果。声明值内联的唯一原因是当您有一组要开始的数据时。相反,如果您希望以空字符串开头并在处理数据时附加值(例如解析文件),那么您将使用第二组语句。