> 백엔드 개발 > Golang > Variadic 래퍼 함수에서 메모리 재할당을 방지하는 방법은 무엇입니까?

Variadic 래퍼 함수에서 메모리 재할당을 방지하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-02 18:19:02
원래의
610명이 탐색했습니다.

How to Avoid Memory Reallocation in Variadic Wrapper Functions?

메모리 재할당이 없는 Variadic 래퍼

Variadic 함수는 매개변수 처리에 유연성을 제공하지만 래퍼 함수에 항목을 추가하면 메모리 재할당이 발생할 수 있습니다. 이 문서에서는 디버깅 편의성을 유지하면서 이 문제를 방지할 수 있는 솔루션을 탐색합니다.

가변 래퍼를 만드는 일반적인 접근 방식 중 하나는 인수를 내부 함수에 직접 전달하는 것입니다.

<code class="go">func Debug(a ...interface{}) {
    if debug {
        fmt.Fprintln(out, prefix, sep, a...)
    }
}</code>
로그인 후 복사

그러나 이 문서는 "인수 너무 많음" 오류가 발생할 수 있습니다. 또 다른 접근 방식은 vararg를 사용하여 인수를 래핑하는 것입니다. 그러나 이렇게 하면 "인터페이스 유형에 이름 목록이 허용되지 않습니다."라는 오류가 발생합니다.

유효해 보이는 해결책은 임시 슬라이스를 만들고 접두사, 구분 기호,

<code class="go">func Debug(a ...interface{}) {
    if debug {
        sl := make([]interface{}, len(a)+2)
        sl[0] = prefix
        sl[1] = sep
        for i, v := range a {
            sl[2+i] = v
        }

        fmt.Fprintln(out, sl...)
    }
}</code>
로그인 후 복사

이 방법은 작동하지만 불필요한 메모리 할당이 필요합니다.

Slick 솔루션으로 추가

더 효율적입니다. 접근 방식은 추가 기능을 활용하는 것입니다. 원래 인수에 접두사와 구분 기호를 추가하면 메모리 재할당을 피할 수 있습니다.

<code class="go">func Debug(a ...interface{}) {
    if debug {
        fmt.Fprintln(out, append([]interface{}{prefix, sep}, a...)...)
    }
}</code>
로그인 후 복사

이 한 줄짜리 방법은 새 슬라이스를 생성하지 않고도 가변 인수에 접두사와 구분 기호를 효과적으로 추가합니다. 이는 간결하고 효율적이며 가변 래퍼의 기능을 손상시키지 않으면서 메모리 할당 문제를 해결합니다.

위 내용은 Variadic 래퍼 함수에서 메모리 재할당을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿