بسم الله الرحمن الرحيم
تحتوي لغة GO على المؤشرات مشابه لغة C , و لكن قام المطورون بمنع العمليات الحسابية على مواقع الذاكرة , و لمن ليس لديه فكرة فسوف تتوضح لديك الفكرة عندما تتنفذ المثالين التالين :
في هذا السطر أستخدمنا الحرف & لطباعة عنوان المتغير في الذاكرة :
كمبرمج يجب أن تعلم بأن لك متغير في برنامج عنوان في الذاكرة يتم حفظ فيه القيم , و بالنسبة للمبرمجين فالذاكرة من الموارد المهمة جداّ و يجب المحافظة لذا قم المطورون بأستخدام المؤشرات, حيث أنه برمجياً من الأوفر نسخ عنوان الذاكرة الدال على البيانات بدل نسخ البيانات كلما تم التعامل معها في برنامجك , و هذا مثال بسيط على أستخدامها :
و في العادة يتم أستخدام هذه الطريقة :
قم بترجمة البرنامج و طباعته ستظهر لك هذه النتيجة :
معنى <nil> في برنامجنا هو أن المؤشر لا يحتوي على أي عنوان ذاكرة , و لتحديد موقع غير مستخدم في الذاكرة توفر لغة GO الوظيفة البرمجية new و سوف نقوم بتعديل مثالنا السابق بأستخدمها :
تلاحظ اننا في معاملات الوظيفة البرمجية new حددنا نوع المؤشر و هو int :
يمكن أختصار التصريح عن مؤشر للتالي :
package main
import "fmt"
func main() {
i := 5
fmt.Println("i is: ", i)
fmt.Println("address of i is: ", &i)
}
import "fmt"
func main() {
i := 5
fmt.Println("i is: ", i)
fmt.Println("address of i is: ", &i)
}
fmt.Println("address of i is: ", &i)
كمبرمج يجب أن تعلم بأن لك متغير في برنامج عنوان في الذاكرة يتم حفظ فيه القيم , و بالنسبة للمبرمجين فالذاكرة من الموارد المهمة جداّ و يجب المحافظة لذا قم المطورون بأستخدام المؤشرات, حيث أنه برمجياً من الأوفر نسخ عنوان الذاكرة الدال على البيانات بدل نسخ البيانات كلما تم التعامل معها في برنامجك , و هذا مثال بسيط على أستخدامها :
package main
import "fmt"
func main() {
i := 5
ptr:= &i
fmt.Println("i is: ", i)
fmt.Println("address of i is: ", &i)
fmt.Println("ptr is : ", *ptr)
fmt.Println("address of ptr is : ", ptr)
}
import "fmt"
func main() {
i := 5
ptr:= &i
fmt.Println("i is: ", i)
fmt.Println("address of i is: ", &i)
fmt.Println("ptr is : ", *ptr)
fmt.Println("address of ptr is : ", ptr)
}
المؤشر هو متغير يحتوي على عنوان في الذاكرة بدل قيمة , و في المثال السابق ستجد أن المتغير ptr و i لديهما نفس العنوان في الذاكرة :
i is: 5
address of i is: 0xf840035000
ptr is : 5
address of ptr is : 0xf840035000
address of i is: 0xf840035000
ptr is : 5
address of ptr is : 0xf840035000
حيث قمنا بأسناد عنوان الذاكرة الخاص بالمتغير i للمؤشر ptr و هذه الصورة مثال على طريقة التمثيل في الذاكرة :
لنقوم بتعديل القيمة المخزنة في المؤشر ptr و نلاحظ التغيرات :
package main
import "fmt"
func main() {
i := 5
ptr:= &i
*ptr = 12
fmt.Println("i is: ", i)
fmt.Println("address of i is: ", &i)
fmt.Println("ptr is : ", *ptr)
fmt.Println("address of ptr is : ", ptr)
}
import "fmt"
func main() {
i := 5
ptr:= &i
*ptr = 12
fmt.Println("i is: ", i)
fmt.Println("address of i is: ", &i)
fmt.Println("ptr is : ", *ptr)
fmt.Println("address of ptr is : ", ptr)
}
ملاحظة : عند التعامل مع القيم التي يؤشر لها المؤشر يجب أستخدام النجمة قبل أسم المؤشر :
*ptr = 12
fmt.Println("ptr is : ", *ptr)
fmt.Println("ptr is : ", *ptr)
- التصريح عن المؤشرات :
في بداية هذا الدرس تعلمت أحد الطرق لتصريح عن المؤشرات :
i:=5
ptr:= &i
ptr:= &i
و في العادة يتم أستخدام هذه الطريقة :
var ptr1 *int
var ptr2 *uint32
var ptr2 *uint32
تلاحظ أننا قمنا بكتابة النجمة "*" لدلالة على أننا نقوم بالتصريح عن مؤشر .
- حجز الذاكرة للمتغير :
في التصريح عن المؤشرات صرحنا عن المؤشران ptr1 و ptr2 , لذا دعنا نحاول أن نقوم بطباعة مواقع الذاكرة لمؤشر ptr1 :
package main
import "fmt"
func main() {
var ptr1 *int
fmt.Printf("ptr1 address : %v\n",ptr1)
}
قم بترجمة البرنامج و طباعته ستظهر لك هذه النتيجة :
ptr1 address : <nil>
معنى <nil> في برنامجنا هو أن المؤشر لا يحتوي على أي عنوان ذاكرة , و لتحديد موقع غير مستخدم في الذاكرة توفر لغة GO الوظيفة البرمجية new و سوف نقوم بتعديل مثالنا السابق بأستخدمها :
package main
import "fmt"
func main() {
var ptr1 *int = new(int)
fmt.Printf("ptr1 address : %v\n",ptr1)
}
تلاحظ اننا في معاملات الوظيفة البرمجية new حددنا نوع المؤشر و هو int :
new(int)
يمكن أختصار التصريح عن مؤشر للتالي :
var ptr1 := new(int)
و في نهاية يجب أن أنبه أنني تطرق لنوع من المؤشرات و هو الشرائح Slices في هذا الدرس .
شيءٌ جميلٌ أنك تركز علي لغة go في الوقت الذي لم ينتبه فيه إليها إلا القليل :)
ردحذفليتك تجمع هذا الشرح حينما يكتمل في كتابٍ إليكتروني و تنشره علي موقع (كتب):
http://www.kutub.info/library/category/1
وفقك الله ^_^
أولا : جزاك الله خير على التشجيع الدائم
حذفو بخصوص الكتاب فبدأت في تأليفه و أن شاء الله بعد أنتهاءه بأنشره :-)
الهم اعطه خير من مما اعطى وارزقه و ارشه فانت القادر على ذالك شكرا الاخ
ردحذف