تسلط بر نشانگرها در Go: یک راهنمای کامل مبتدی به پیشرفت

به (بزرگ شدن) یک زبان قدرتمند و استاتیک تایپ شده است که برای سادگی ، عملکرد و مقیاس پذیری ساخته شده است. یکی از مهمترین ویژگی هایی که از بسیاری از زبانهای سطح بالا جدا می شود ، پشتیبانی از آن است نشانگرها، که به شما امکان می دهد آدرس های حافظه را مستقیماً ارجاع دهید.
در این وبلاگ ، هر آنچه را که باید در مورد نشانگرها در Go بدانید-از آنچه هستند و به همین دلیل مهم هستند ، می آموزید تا نحوه استفاده از آنها در برنامه های دنیای واقعی استفاده کنید.
📌 نشانگر چیست؟
بوها اشاره کننده متغیری است که دارای آدرس حافظه از متغیر دیگر
👉 قیاس:
به عنوان یک خانه و ارزش آن به عنوان شخصی که در داخل زندگی می کند ، به یک متغیر فکر کنید. یک اشاره گر مانند خانه است خطاب نوشته شده بر روی یک یادداشت شما شخص را حمل نمی کنید – آدرس را حمل می کنید.
syntax اشاره گر اصلی در GO
var x int = 10
var p *int = &x
-
x
استint
متغیر -
&x
می دهد آدرس حافظه ازx
بشر -
p
است اشاره گر به int (*int
) آن آدرس را ذخیره می کند.
referencencing
به مقدار را دریافت کنید ذخیره شده در آدرس نشانگر:
fmt.Println(*p) // Output: 10
⚙ چرا از نشانگرها استفاده می کنید؟
- 🔁 از کپی کردن مقادیر بزرگ خودداری کنید (سود عملکرد).
- 🧠 مقادیر را تغییر دهید توابع داخل
- ⚒ با ساختار داده های پویا کار کنید (مانند لیست های مرتبط ، درختان).
- 🚀 حالت بین توابع یا گوروتین ها را به اشتراک بگذارید.
🧑💻 مثال: مقدار را از طریق نشانگر تغییر دهید
func update(val *int) {
*val = 99
}
func main() {
num := 50
update(&num)
fmt.Println(num) // Output: 99
}
✅ *val = 99
اصلی را تغییر می دهد num
از آنجا که ما با آدرس حافظه آن کار می کنیم.
🆚 ارزش در مقابل نشانگر
نشان | مقدار (کپی) | اشاره گر (مرجع) |
---|---|---|
استفاده از حافظه | بیشتر (مقدار کپی) | کمتر (آدرس کپی) |
اصلاح اصلی؟ | ❌ نه | ✅ بله |
عمل | کندتر با داده های بزرگ | سریعتر |
🆕 new()
کلمه کلیدی
ptr := new(int)
*ptr = 77
fmt.Println(*ptr) // Output: 77
-
new(int)
حافظه را برای یکint
و یک اشاره گر به آن برمی گردد. - مقدار پیش فرض اشاره گر صفر است.
👤 نشانگرهایی با ساختار
type User struct {
Name string
}
func rename(u *User) {
u.Name = "Alice"
}
func main() {
user := User{Name: "Bob"}
rename(&user)
fmt.Println(user.Name) // Output: Alice
}
✅ اصلاحات در داخل عملکرد در خارج باقی مانده است زیرا ما یک نشانگر را پشت سر می گذاریم.
🧠 مشکلات رایج
- ❌ در حال ثبت نام یک اشاره گر صفر
var p *int
fmt.Println(*p) // panic: runtime error: invalid memory address
- ✅ همیشه بررسی کنید
nil
:
if p != nil {
fmt.Println(*p)
}
🔄 عبور با مقدار در مقابل نشانگر (recap)
مورد | از اشاره گر استفاده می کنید؟ |
---|---|
داده های اصلی را تغییر دهید | ✅ بله |
از ساختارهای بزرگ عبور کنید | ✅ بله |
مقادیر کوچک فقط خواندنی | ❌ نه |
🔚 نتیجه گیری
نشانگرها یک هستند مفهوم اصلی در Go That Ollock عملبا کنترل کردنوت انعطاف پذیریبشر با تسلط بر نشانگرها ، شما درک عمیق تری از چگونگی کار کردن داده ها و حافظه در زیر کاپوت کسب می کنید – مهارت های مهم برای هر توسعه دهنده جدی GO.
✨ به یاد داشته باشید: با قدرت عالی (نشانگرها) مسئولیت بزرگی (ایمنی حافظه) به وجود می آید!