下面有什么区别?
type Demo struct {s string}
func getDemo1()([]*Demo) // 1
func getDemo2()([]Demo) // 2
getDemo1
和getDemo2
之间是否存在内存差异?
答案 0 :(得分:0)
尽管我做出了更好的判断,只是将OP发送给巡回演出和文档/说明,但我将回答这个问题。主要是因为这样:
getDemo1和getDemo2之间是否存在内存差异?
这个特定问题的答案取决于您如何利用切片。 Go是按值传递,因此传递结构值会复制它们。例如,请考虑以下示例。
https://play.golang.org/p/VzjYXwUy0EI
d1 := getDemo1()
d2 := getDemo2()
for _, v := range d1 {
// v is of type *Demo, so this modifies the value in the slice
v.s = "same"
}
fmt.Println(d1)
for _, v := range d2 {
// v is of type Demo, and is a COPY of the struct in the slice, so the original is not modified
v.s = "same"
}
关于内存问题,显然使用*Demo
,它返回范围内的指针的副本(有效地是uint64
),而不是返回Demo
的副本(整个struct及其所有字段)将使用更少的内存。 但,您仍然可以直接索引到数组以避免复制,除非您在切片中传递单个项目。
也就是说,通过传递切片本身,这两种类型的开销没有区别。切片是数组的抽象,传递过来的切片本身仅仅是一个切片标头,无论切片包含哪种类型,它都是相同的内存占用。
顺便说一句,在[]Demo
的情况下修改值的范例是:
for i, _ := range d2 {
d2[i].s = "same"
}