>백엔드 개발 >Golang >Go의 '새' 함수에서 값 대신 포인터를 반환하는 이유는 무엇입니까?

Go의 '새' 함수에서 값 대신 포인터를 반환하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-24 02:30:11578검색

Why Return a Pointer Instead of a Value in Go's

Go 생성자의 주소 반환 사용법 이해: 신규 반환과 직접 반환

명시적 생성자를 제공하는 다른 언어와 달리 Go는 생성자 대신 "새" 함수. 그런데 왜 File 객체를 직접 반환하지 않고 Go의 "New" func에서 주소(&f)를 반환하는 것이 흔한가요?

주소와 직접 반환의 차이점

Go의 구문에서는 값(비포인터) 또는 포인터를 반환할 수 있으며 결정은 개발자에게 맡깁니다. 일반적으로 포인터는 값이 1보다 유용할 때 반환됩니다. 반환된 값이

1인 경우 특히 그렇습니다. 포인터 수신기가 있는 여러 메서드 있음:

포인터를 반환하면 메서드가 포인터 수신기를 사용하더라도 반환된 개체에서 직접 메서드 호출을 연결할 수 있습니다. 이렇게 하면 반환된 값을 변수에 저장하고 메서드를 수동으로 호출할 필요가 없습니다.

2. 주소 지정이 불가능한 데이터 구조에 저장됨:

맵과 같은 일부 데이터 구조는 값의 직접 주소 지정을 지원하지 않습니다. 포인터를 반환하면 이러한 제한을 우회하여 데이터 구조에 저장된 값에 대한 메서드 호출이 가능해집니다.

3. 자주 전달되는 대형 구조체:

포인터는 메모리 사용량과 성능을 최적화하므로 많이 전달되는 대형 구조체에 유리합니다.

예 비교:

포인터를 사용하는 메서드가 포함된 간단한 구조체를 생각해 보세요. 수신자:

type My int

func (m *My) Str() string { return strconv.Itoa(int(*m)) }

func createMy(i int) My { return My(i) }  // Direct return
func createMyPtr(i int) *My { return (*My)(&i) }  // Address return

직접 반환 값을 사용하려고 할 때:

fmt.Println(createMy(12).Str())

오류가 발생합니다: "createMy(12)에서 포인터 메서드를 호출할 수 없습니다." 그러나 주소 return:

fmt.Println(createMyPtr(12).Str())

메서드 호출은 오류 없이 성공합니다.

결론:

Go의 "New" func에 직접적으로 포함된 포인터 또는 값은 반환된 객체의 의도된 사용법을 기반으로 합니다. 포인터는 포인터 수신기, 주소 지정이 불가능한 데이터 구조 또는 자주 전달되는 대규모 구조체가 포함된 메서드를 처리할 때 이점을 제공합니다.

위 내용은 Go의 '새' 함수에서 값 대신 포인터를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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