الجمعة، 31 أغسطس 2012

تعلم لغة البرمجة Go بالعربي ( الدرس التاسع )

بسم الله الرحمن الرحيم

تحتوي لغة GO على المؤشرات مشابه لغة C , و لكن قام المطورون بمنع العمليات الحسابية على مواقع الذاكرة ,  و لمن ليس لديه فكرة فسوف تتوضح لديك الفكرة عندما تتنفذ المثالين التالين :

package main

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)


}

المؤشر هو متغير يحتوي على عنوان في الذاكرة بدل قيمة , و في المثال السابق ستجد أن المتغير ptr و i لديهما نفس العنوان في الذاكرة :
i is:  5

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)


}

ملاحظة : عند التعامل مع القيم التي يؤشر لها المؤشر يجب أستخدام النجمة قبل أسم المؤشر :

   *ptr = 12

    fmt.Println("ptr is : ", *ptr)

  • التصريح عن المؤشرات :
في بداية هذا الدرس تعلمت أحد الطرق لتصريح عن المؤشرات :
  i:=5  
ptr:= &i

و في العادة يتم أستخدام هذه الطريقة :

var ptr1 *int

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 في هذا الدرس .

هناك 3 تعليقات:

  1. شيءٌ جميلٌ أنك تركز علي لغة go في الوقت الذي لم ينتبه فيه إليها إلا القليل :)
    ليتك تجمع هذا الشرح حينما يكتمل في كتابٍ إليكتروني و تنشره علي موقع (كتب):
    http://www.kutub.info/library/category/1

    وفقك الله ^_^

    ردحذف
    الردود
    1. أولا : جزاك الله خير على التشجيع الدائم

      و بخصوص الكتاب فبدأت في تأليفه و أن شاء الله بعد أنتهاءه بأنشره :-)

      حذف
  2. الهم اعطه خير من مما اعطى وارزقه و ارشه فانت القادر على ذالك شكرا الاخ

    ردحذف