할당 수수께끼: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!