getter에서 반환하기 전에 개인용 슬라이스 필드에 복사본을 사용해야 합니까?

WBOY
풀어 주다: 2024-02-09 16:30:10
앞으로
703명이 탐색했습니다.

在从 getter 返回私有切片字段之前,是否应该对它们使用复制?

객체 지향 프로그래밍에서 getter 메서드는 일반적으로 전용 멤버 변수의 값을 얻는 데 사용됩니다. 그러나 때때로 다음과 같은 질문이 있습니다. getter 메소드에서 반환하기 전에 전용 슬라이스 필드 복사를 사용해야 합니까? 이 질문에 대한 대답은 절대적이지 않으며 특정 상황에 따라 다릅니다. 경우에 따라 개인 슬라이스 필드를 복사하면 외부 코드가 필드를 수정하는 것을 방지하여 데이터의 일관성과 보안을 보호할 수 있습니다. 그러나 고성능이 요구되는 일부 시나리오에서는 복사 작업으로 인해 추가 오버헤드가 발생할 수 있습니다. 이 경우 참조를 슬라이스 필드에 직접 반환하는 것을 고려할 수 있습니다. 따라서 특정 상황에 따라 장단점을 비교하고 프라이빗 슬라이스 필드의 반환을 처리하는 적절한 방법을 선택해야 합니다.

질문 내용

struct getter가 필요한 전용 슬라이스 필드가 있는 경우 슬라이스를 반환하기 전에 복사해야 합니까?

개인 슬라이스를 getter에서 직접 반환하는 것이 안전한지 확인하고 싶습니다. 호출자가 getter의 반환 값을 통해 비공개 슬라이스를 수정하는 것을 원하지 않기 때문입니다.

지금까지 테스트한 결과 반환된 슬라이스가 비공개 슬라이스 필드에 연결되지 않은 것 같습니다. 그러나 이것이 모든 시나리오에서 작동하는지 확실하지 않으며 필요하지 않은 경우 copy를 사용하고 싶지 않습니다.

내가 시도한 방법은 다음과 같습니다.

으아악

다음은 copy에 대한 getter의 모습입니다:

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]
}
로그인 후 복사

해결 방법

@kostix가 댓글에서 언급했듯이 시나리오에 따라 다릅니다.

OP의 경우 copy를 사용하고 싶습니다. 왜냐하면 호출자가 수정할 수 없도록 getter의 출력을 개인 필드와 분리하고 싶기 때문입니다.

위 내용은 getter에서 반환하기 전에 개인용 슬라이스 필드에 복사본을 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!