>백엔드 개발 >Golang >Go 메모리 할당: `new()` 대 `&{}` – 실제 차이점은 무엇입니까?

Go 메모리 할당: `new()` 대 `&{}` – 실제 차이점은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-16 22:15:18878검색

Go Memory Allocation: `new()` vs `&{}` – What's the Real Difference?

할당 수수께끼: new() 대 Go의 "일반" 포인터

Go 프로그래밍 영역에서 다음과 같은 질문이 발생합니다. 새로운 메모리를 할당할 때 다음 두 코드 세그먼트 사이에는 상당한 차이가 있습니다. object?

코드 세그먼트 1:

v := &Vector{}

코드 세그먼트 2:

v := new(Vector)

정답:

놀랍게도 두 코드 세그먼트 간에는 눈에 띄는 차이가 없습니다. 둘 다 동일한 결과를 얻습니다: Vector 유형의 새 인스턴스에 대한 포인터를 생성합니다.

자세한 설명:

new(Vector)를 호출할 때 new 키워드 새 Vector 객체에 메모리를 할당하고 해당 객체에 대한 포인터를 반환합니다. 마찬가지로 &Vector{}도 새 Vector 객체에 메모리를 할당하고 이에 대한 포인터를 반환합니다.

설명하기 위해 다음 코드를 고려해 보세요.

package main

import "fmt"
import "reflect"

type Vector struct {
    x   int
    y   int
}

func main() {
    v := &Vector{}
    x := new(Vector)
    fmt.Println(reflect.TypeOf(v))
    fmt.Println(reflect.TypeOf(x))
}

출력:

*main.Vector
*main.Vector

보시다시피 v와 x는 모두 Vector 객체에 대한 포인터입니다. 유형은 동일합니다.

사용 사례:

두 코드 세그먼트 모두 동일한 결과를 달성하지만 일부 개발자는 할당된 메모리가 더 적합할 때 new가 더 적절하다고 주장합니다. 이중 역참조 오류를 방지하는 데 도움이 되므로 즉시 역참조하고 사용합니다. 예:

// Allocates memory and immediately dereferences it
v := new(Vector).x

결론:

결론적으로 Go에서 new 할당 구문과 "일반" 할당 구문 중 하나를 선택하는 것은 순전히 개인 취향에 달려 있습니다. 두 방법 모두 메모리를 할당하고 새로 생성된 객체에 대한 포인터를 반환하여 동일한 기능을 제공합니다.

위 내용은 Go 메모리 할당: `new()` 대 `&{}` – 실제 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.