>백엔드 개발 >Golang >Go 메모리 할당: 언제 `new()`와 `&`를 사용해야 합니까?

Go 메모리 할당: 언제 `new()`와 `&`를 사용해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-27 15:15:12354검색

Go Memory Allocation: When Should I Use `new()` vs. `&`?

할당을 넘어서: new()와 일반 할당의 차이점 탐색

Go에서는 메모리 관리가 가장 중요하며 new() 함수를 통해 메모리를 할당합니다. 또는 앰퍼샌드(&)는 효율성과 정확성에 관한 논쟁을 불러일으켰습니다. 이 기사에서는 유사점과 잠재적인 차이점을 검토하면서 이 두 가지 할당 방법의 미묘한 차이를 자세히 살펴보겠습니다.

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

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