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

  • 本文关键字:struct 区别 pointers go slice
  • 更新时间 :
  • 英文 :


下面有什么区别?

type Demo struct {s string}
func getDemo1()([]*Demo)  // 1
func getDemo2()([]Demo)  // 2

getDemo1getDemo2之间有记忆差异吗?

我将回答这个问题,尽管我的判断力更好,只是将 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的副本(整个结构及其所有字段(会使用更少的内存。但是,您仍然可以直接索引到数组以避免复制,除非您在切片中传递单个项目。

也就是说,传递切片本身,这两种类型的开销没有区别。切片是数组的抽象,传递的切片本身只是一个切片标头,无论切片包含什么类型,它都是相同的内存占用量。

顺便说一句,在[]Demo的情况下修改值的范例是:

for i, _ := range d2 {
d2[i].s = "same"
}

最新更新