English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
الإشارة في لغة البرمجة Go هي متغير يُستخدم لتخزين عنوان ذاكرة متغير آخر. تُسمى الإشارات أيضًا متغيرات خاصة في Golang.المتغيرللحفظ في عنوان محدد في ذاكرة النظام. دائمًا ما يتم العثور على عناوين الذاكرة (بتنسيق السداسي العشري) بتنسيق السداسي العشري (باستخدام 0x، مثل 0xFFAAF إلخ).
دور الإشارة؟
للتفهم هذا النوع من الإشارات، يجب أن نفهم مفهوم المتغير أولاً. المتغير هو الاسم الذي يتم تخصيصه لتحديد موقع تخزين البيانات. لاستعادة البيانات المخزنة، نحتاج إلى عنوان التخزين الخاص بالمواقع. إن تذكر جميع عناوين الذاكرة (بتنسيق السداسي العشري) هو تكلفة، لذا نستخدم المتغيرات لتخزين البيانات ونستطيع الوصول إليها فقط من خلال استخدام اسم المتغير.
يُسمح بلغة Golang أيضًا باستخدام تعبيرات نصية لتحديد الأعداد السداسية العشرية في المتغيرات، أي، من0xرقم البداية هو عدد سداسي عشري.
مثال:في البرنامج التالي، سنخزن الأعداد السداسية العشرية في المتغيرات. ولكن يمكنك رؤية أن نوع القيم هوintوإذا قلنا إنها مخزنة كعددي عشري، أوintالقيم الناتجة من تنسيق السداسي العشري مخزنة في تنسيق العددي العشري. ولكن، نقطة التركيز الرئيسية لهذا المثال هي أننا مخزننا القيم السداسية العشرية (نراها كعناوين ذاكرة) ولكنها ليست إشارات لأنها لا تشير إلى أي موقع ذاكرة آخر لغير متغير آخر. إنها مجرد متغير معين. لذا، هذا يتطلب استخدام الإشارات.
// المخزنة بتنسيق السداسي العشري package main import "fmt" func main() { // المخزنة بتنسيق السداسي العشري // القيم المخزنة في المتغير x := 0xFF y := 0x9C // عرض القيم fmt.Printf("نوع المتغير x هو %T\n", x) fmt.Printf("قيمة العدد الستة عشري لـ x هي %X\n", x) fmt.Printf("قيمة العدد العشري لـ x هي %v\n", x) fmt.Printf("نوع المتغير y هو %T\n", y) fmt.Printf("قيمة العدد الستة عشري لـ y هي %X\n", y) fmt.Printf("قيمة العدد العشري لـ y هي %v\n", y) }
الإخراج:
نوع المتغير x هو int قيمة العدد الستة عشري لـ x هي FF قيمة العدد العشري لـ x هي 255 نوع المتغير y هو int قيمة العدد الستة عشري لـ y هي 9C قيمة العدد العشري لـ y هي 156
الإشارة هي متغير خاص، ليس فقط لتحديد عناوين ذاكرة متغيرات أخرى، بل أيضًا للإشارة إلى المواقع في الذاكرة وتقديم طريقة للبحث عن القيم المخزنة في هذه المواقع. تُعرف عادةً بأنها نوع خاص من المتغيرات، لأنها تقريبًا يتم بيانها كمتغير، ولكنها تحتوي على*وظيفة (الارتباط).
قبل البدء، سنستخدم في الارتباط بين العناوين اثنين من العمليات المهمة، وهي
وظيفة * مكن من تعريف متغيرات الارتباط ووصول القيم المخزنة في العناوين.
وظيفة & يُدعى محول العناوين، ويُستخدم لتحديد عنوان المتغير أو الوصول إلى عنوان المتغير من خلال المرجع.
إعلان مرجع:
var pointer_name *Data_Type
مثال:هذا هو مرجع النوع النصي، والذي يمكنه تخزينالنصعنوان الذاكرة الخاصة بالمتغير.
var s *string
تحديد المرجع:لذلك، تحتاج إلى استخدام محول العناوين لتحديد مرجع باستخدام عنوان متغير آخر، مثل المثال التالي:
//إعلان متغير عادي var a = 45 //باستخدام تحديد المرجع s //عنوان الذاكرة الخاصة بa var s *int = &a
//برنامج Golang لتوضيح الإعلان //وتحديد المرجع package main import "fmt" func main() { //تعريف متغير عادي var x int = 5748 //إعلان المرجع var p *int //تحديد المرجع p = &x //عرض النتيجة fmt.Println("القيمة المخزنة في x = ", x) fmt.Println("عنوان الذاكرة الخاصة بx = ", &x) fmt.Println("القيمة المخزنة في المتغير p = ", p) }
الإخراج:
القيمة المخزنة في x = 5748 عنوان الذاكرة الخاصة بx = 0xc000066090 القيمة المخزنة في المتغير p = 0xc000066090
ملاحظة هامة:
قيمة المرجع الافتراضية أو الصفرية دائمًا هي nil. أو يمكنك القول إن المرجع غير المُعدل دائمًا يحمل قيمة nil.
//قيمة nil للمرجع package main import "fmt" func main() { //تعريف المرجع var s *int //عرض النتيجة fmt.Println("s = ", s) }
الإخراج:
s = nil
يمكن إكمال إعلان المتغير المرجعي والتحديد في سطر واحد.
var s *int = &a
إذا كنت ترغب في تحديد نوع البيانات وتعريف المتغير المرجعي في نفس الوقت، فإن المتغير المرجعي سيكون قادرًا على التعامل مع عنوان المتغيرات من نوع البيانات المحدد. على سبيل المثال، إذا كنت تستخدم مرجعًا للنوع النصي، فإن عنوان المتغير الذي سيتم توفيره للمرجع سيكون نوعًا نصيًا فقط وليس أي نوع آخر.
للتحكم في المشاكل المذكورة أعلاه، يمكن استخدامكلمة المفتاح varمفهوم التنبؤ النوعي للنوع. لا يتطلب تحديد نوع البيانات أثناء الإعلان. يمكن تحديد نوع المتغير المرجعي أيضًا من قبل محول المعادلات مثل المتغيرات العادية. في هذا المثال، لن نستخدم محول المعادلات (*). سيتم تحديد المتغير المرجعي باستخدام عنوان آخر المتغير داخليًا.
//مثال على برنامج Golang //باستخدام التنبؤ النوعي //مؤشر المتغير package main import "fmt" func main() { // يستخدم كلمة var // لم نحدد // أي نوع يحتوي على متغير var y = 458 // يستخدم متغير الاشارة // كلمة var، لا تُحدد // النوع var p = &y fmt.Println("القيمة المخزنة في y = ", y) fmt.Println("عنوان y = ", &y) fmt.Println("القيمة المخزنة في متغير الاشارة p = ", p) }
الإخراج:
القيمة المخزنة في y = 458 عنوان y = 0xc0000120a8 القيمة المخزنة في متغير الاشارة p = 0xc0000120a8
يمكنك أيضًا استخدامالقصة القصيرة (:=)اللغة لتعريف وتحديد المتغيرات المرجعية. إذا استخدمنا&(عنوان)سيقوم محول المعادلات بتحديد المتغير كمتغير مرجع إذا تم نقل عنوان المتغير إليه، حيث سيحدد محول المعادلات المتغير كمتغير مرجع داخليًا.
//مثال على برنامج Golang //باستخدام لغة الترميز المختصرة //مؤشر المتغير package main import "fmt" func main() { // باستخدام عملاق := للإعلان // يتم تخصيص المتغير y := 458 // باستخدام متغير الاشارة // يتم تخصيصه من خلال := // عنوان المتغير y p := &y fmt.Println("القيمة المخزنة في y = ", y) fmt.Println("عنوان y = ", &y) fmt.Println("القيمة المخزنة في متغير الاشارة p = ", p) }
الإخراج:
القيمة المخزنة في y = 458 عنوان y = 0xc000066090 القيمة المخزنة في متغير الاشارة p = 0xc000066090
من المعروف أن عنصر * يُسمى أيضًا عملاق إزالة الاشارة. وهو يستخدم ليس فقط لتحديد متغير الاشارة، بل أيضًا لاستدعاء القيمة المخزنة في المتغير الذي يشير إليه، عادة ما يُسمىالاشارة المباشرة أو إزالة الاشارة،عنصر * يُسمى أيضًا قيمة العنوان، دعونا نأخذ مثالًا لفهم هذا المفهوم بشكل أفضل:
// مثال على برنامج Golang // مفهوم إزالة الاشارة package main import "fmt" func main() { // يستخدم كلمة var // لم نحدد // أي نوع يحتوي على متغير var y = 458 // يستخدم متغير الاشارة // كلمة var، لا تُحدد // النوع var p = &y fmt.Println("القيمة المخزنة في y = ", y) fmt.Println("عنوان y = ", &y) fmt.Println("القيمة المخزنة في متغير الاشارة p = ", p) // هذا هو إزالة الاشارة من الاشارة // يتم استخدام عملاق * قبل الاشارة // المتغير يستخدم لاستدعاء القيمة المخزنة // يشير إلى المتغير الذي يشير إليه fmt.Println("القيمة المخزنة في y (*p) = ", *p) }
الإخراج:
القيمة المخزنة في y = 458 عنوان y = 0xc0000120a8 القيمة المخزنة في متغير الاشارة p = 0xc0000120a8 القيمة المخزنة في y (*p) = 458
يمكنك أيضًا تغيير قيمة الاشارة أو الموقع في الذاكرة، وليس تخصيص قيمة جديدة للمتغير.
package main import "fmt" func main() { // يستخدم كلمة var // لم نحدد // لم يتم تحديد نوع المتغير var y = 458 // يستخدم متغير الاشارة // كلمة var، لا تُحدد النوع var p = &y fmt.Println("القيمة التي كانت مخزنة في y قبل التغيير = ", y) fmt.Println("عنوان y = ", &y) fmt.Println("القيمة المخزنة في متغير الاشارة p = ", p) // هذا هو إزالة الاشارة من الاشارة // يتم استخدام عملاق * قبل الاشارة // المتغير يستخدم لاستدعاء القيمة المخزنة // يشير إلى المتغير الذي يشير إليه fmt.Println("القيمة التي كانت مخزنة في y(*p) قبل التغيير = ", *p) // لتغيير قيمة y // القيمة الجديدة للاشارة *p = 500 fmt.Println("القيمة التي تم تغييرها وتخزينها في y(*p) = ", y) }
الإخراج:
القيمة التي كانت مخزنة في y قبل التغيير = 458 عنوان y = 0xc0000120a8 القيمة المخزنة في متغير الاشارة p = 0xc0000120a8 القيمة التي كانت مخزنة في y(*p) قبل التغيير = 458 القيمة التي تم تغييرها وتخزينها في y(*p) = 500