首页 > 文章列表 > 在返回私有切片字段之前,是否应该对getter方法返回的切片做复制操作?

在返回私有切片字段之前,是否应该对getter方法返回的切片做复制操作?

290 2024-04-20
问题内容

如果 struct 有一个需要 getter 的私有切片字段,是否应该在返回切片之前复制该切片?

我想确认直接从 getter 返回私有切片是否安全,因为我不希望调用者能够通过 getter 的返回值修改它们。

从我到目前为止的测试来看,返回的切片似乎没有链接到私有切片字段。 但是,我不确定这是否适用于所有场景,并且如果不需要,我不想使用 copy

这是我尝试过的:

package main

import "fmt"

type basket struct {
    fruits []string
}

func (b *basket) fruits() []string {
    return b.fruits
}

func (b *basket) addfruit(fruit string) {
    b.fruits = append(b.fruits, fruit)
}

func main() {
    basket := &basket{}
    basket.addfruit("apple")
    basket.addfruit("banana")
    basket.addfruit("orange")

    fruits := basket.fruits()
    fmt.println(fruits) // [apple banana orange]

    fruits = append(fruits, "mango")
    fruits = append(fruits, "lemon")
    fruits = append(fruits, "pineapple")
    fmt.println(fruits)          // [apple banana orange mango lemon pineapple]
    fmt.println(basket.fruits()) // [apple banana orange]
}

下面是 copy 的 getter 的样子:

func (b *Basket) Fruits() []string {
    result := make([]string, len(b.fruits))
    copy(result, b.fruits)
    return result
}


正确答案


正如 @kostix 在评论中提到的,这取决于场景。

对于OP中的那个,我们希望使用copy,因为我们希望将Getter的输出与私有字段分开,这样调用者就无法修改它。