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