पॉइंटर्स बनाम वैल्यूज: Go में पैरामीटर्स और रिटर्न वैल्यूज में * और & का उपयोग कब करें?
मैंने अभी Go सीखना शुरू किया है और मैं लगातार भ्रमित हो जाता हूँ कि कब पॉइंटर पास करना है और कब वैल्यू। लगता है मैंने बहुत सारे आर्टिकल पढ़ लिए, लेकिन प्रैक्टिस में फिर भी गलत करता हूँ।
उदाहरण के लिए, मेरे पास एक User स्ट्रक्चर है और एक फंक्शन है जो इसे अपडेट करता है:
```go
type User struct {
Name string
Age int
Score float64
}
func UpdateScore(u User, newScore float64) {
u.Score = newScore
}
```
जब मैं `UpdateScore(myUser, 95.5)` कॉल करता हूँ, तो कॉल के बाद `myUser.Score` वही रहता है। मुझे समझ आया कि ऐसा इसलिए है क्योंकि Go स्ट्रक्चर को कॉपी करता है। फिर मैं `*User` में बदलता हूँ:
```go
func UpdateScore(u *User, newScore float64) {
u.Score = newScore
}
```
अब यह काम करता है। लेकिन जब मैं एक फंक्शन लिखता हूँ जो एक नया यूज़र रिटर्न करता है, तो मैं दो विकल्प देखता हूँ:
```go
func NewUser(name string, age int) User { ... }
func NewUserPtr(name string, age int) *User { ... }
```
इनमें से कौन सा सही है? और बड़े स्ट्रक्चर्स के साथ क्या करें? क्या हर जगह पॉइंटर्स लिखें? बेसिक टाइप्स के बारे में क्या?