Go에서는 메모리 관리가 가장 중요하며 new() 함수를 통해 메모리를 할당합니다. 또는 앰퍼샌드(&)는 효율성과 정확성에 관한 논쟁을 불러일으켰습니다. 이 기사에서는 유사점과 잠재적인 차이점을 검토하면서 이 두 가지 할당 방법의 미묘한 차이를 자세히 살펴보겠습니다.
얼핏 보면 코드 조각이 당신이 제공한 것 같습니다 구별 불가능:
v := &Vector{}
대
v := new(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
표시된 것처럼 두 메서드 모두 Vector 구조체의 인스턴스에 대한 포인터를 반환합니다.
new() 할당과 정규 할당의 존재는 Go 커뮤니티 내에서 혼란을 불러일으켰습니다. 어떤 사람들은 두 가지 옵션을 모두 갖는 것이 불필요하며 잠재적으로 오해를 불러일으킬 수 있다고 주장합니다. 이 토론은 Go 메일링 리스트에서 널리 퍼졌습니다.
[https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs](https://groups.google .com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs)
new()와 일반 할당이 비슷한 결과를 가져온다는 것이 일반적인 합의이지만, 한 가지 주목할 만한 예외가 있습니다. 명명되지 않은 정수 유형이나 기타 기본 유형으로 작업할 때 new()는 포인터를 얻는 유일한 옵션이 됩니다. 다음 코드는 이를 보여줍니다.
p := new(int) // Error: cannot take the address of the type int p := &int{0}
이 시나리오에서 new()는 이름이 지정되지 않은 정수 유형에 대한 포인터 생성을 허용하는 유일한 메서드입니다.
반환 값 측면에서 new() 할당과 일반 할당 사이에는 큰 차이가 없지만 이러한 할당으로 인해 혼란이 발생할 수 있습니다. 그러나 명명되지 않은 정수 또는 기본 유형에 대한 포인터를 처리할 때 new()가 필수적이라는 점을 기억하면 사용법을 명확히 하고 잠재적인 함정을 피하는 데 도움이 될 수 있습니다. Go의 메모리 관리 기술의 미묘함을 이해함으로써 개발자는 효율성과 명확성을 위해 코드를 최적화할 수 있습니다.
위 내용은 Go 메모리 할당: 언제 `new()`와 `&`를 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!