في هذه المقالة ، سوف نستكشف كيفية الاستخدام حدد البيان في Golang وتقديم أمثلة لمساعدتك في تحقيق التوازي والتزامن والمزامنة في برامج Go.
كيفية استخدام بيان التحديد في Golang؟
على غرار بيان التبديل ، فإن حدد البيان يسمح لنا بتحديد وتنفيذ تعبير واحد من بين العديد من التعبيرات ، ولكن الاختلاف الأساسي بينهما يختار والتبديل هو أن حدد البيان يعمل على مبدأ الانتظار ، مما يعني أن ملف حدد البيان لن يتم تنفيذ حتى اكتمال الاتصال.
هنا ، يشير الاتصال إلى إرسال واستقبال البيانات عبر أي قناة معينة. عند اكتمال الاتصال ، يتم إجراء الفحص التالي ، مما يسمح لنا برؤية أن عبارة اختيار لغة Go تعتمد كليًا على القناة.
بناء الجملة لبيان التحديد
الصيغة البسيطة المستخدمة لملف حدد البيان استخدام لغة Go موضحة أدناه:
يختار {
قضية قناة 1 :
// كود للتنفيذ عندما تكون channel_1 جاهزة
قضية القناة_2 :
// كود للتنفيذ عندما تكون channel_2 جاهزة
قضية القناة_3 :
// كود للتنفيذ عندما تكون channel_3 جاهزة
قضية القناة_4 :
// كود للتنفيذ عندما تكون channel_4 جاهزة
تقصير :
// كود للتنفيذ إذا لم تكن أي من القنوات جاهزة
}
هنا:
- داخل أ حدد البيان ، كل حالة تمثل عملية قناة ، والتي يمكن أن تكون عملية استقبال أو عملية إرسال.
- ال حدد البيان ينتظر حتى تصبح إحدى الحالات جاهزة ثم يقوم بتشغيلها وبيان الحالة المرتبط بها.
- يقوم باختيار القناة بشكل عشوائي في حالة وجود قنوات متعددة جاهزة للتنفيذ.
كيفية إنشاء قناة في Golang
لإنشاء قناة في Go ، يمكن للمستخدمين استخدام وظيفة make متبوعة بامتداد تشان الكلمة الأساسية وتحديد نوع القناة ، والتي يمكن أن تكون int أو string أو غيرها.
الفصل : = يصنع ( نوع تشان )تنفيذ بيان التحديد في Golang
هنا ، سوف نقدم عدة أمثلة لمساعدتك على تعلم أساسيات استخدام حدد البيان في جولانج.
مثال 1
المثال التالي لملف حدد البيان يوضح كيفية أدائه عندما تكون كلتا القناتين جاهزين للتنفيذ.
الحزمة الرئيسيةيستورد 'FMT'
func الرئيسي ( ) {
على واحد : = يصنع ( تشان int )
شارع : = يصنع ( سلسلة تشان )
اذهب chan_num ( على واحد )
اذهب chan_str ( شارع )
يختار {
قضية الفصل 1 : = <- على واحد :
FMT. Println ( 'بيانات القناة:' و الفصل 1 )
قضية الفصل 2 : = <- شارع :
FMT. Println ( 'بيانات القناة:' و الفصل 2 )
}
}
func chan_num ( الأسطوانات تشان int ) {
على واحد <- 67
}
func chan_str ( سلسلة تشان str ) {
شارع <- 'Linux'
}
في المثال أعلاه ، أنشأنا قناتين ، على واحد، و شارع واستخدمنا وظائف Go chan_num () لإرسال البيانات إلى قناة الأسطوانات و chan_str () لإرسال البيانات إلى قناة str. نظرًا لأن البرنامج يحتوي على قناتين مختلفتين ، فقد استخدمنا ملف حدد البيان لتنفيذ واحد منهم.
قضية الفصل 1 يقرأ القيمة من قناة الأسطوانات ويعرضها. وبالمثل ، حالة الفصل 2 إرجاع القيمة من شارع قناة. يقوم البرنامج أعلاه بإرجاع إخراج القناة الجاهزة للاستخدام. انتاج |
مثال 2
إذا كنت تريد إضافة تأخير إلى قناة وإعادة إخراج قناة أخرى ، فيمكنك استخدام وقت النوم() تعمل على قناة محددة. يتيح لك ذلك طباعة إخراج القناة الأخرى إلى وحدة التحكم. إليك مثال على مثل هذه الحالة.
الحزمة الرئيسيةيستورد (
'FMT'
'وقت'
)
func الرئيسي ( ) {
على واحد : = يصنع ( تشان int )
شارع : = يصنع ( سلسلة تشان )
اذهب chan_num ( على واحد )
اذهب chan_str ( شارع )
يختار {
قضية الفصل 1 : = <- على واحد :
FMT. Println ( 'بيانات القناة:' و الفصل 1 )
قضية الفصل 2 : = <- شارع :
FMT. Println ( 'بيانات القناة:' و الفصل 2 )
}
}
func chan_num ( الأسطوانات تشان int ) {
على واحد <- 67
}
func chan_str ( سلسلة تشان str ) {
وقت . ينام ( 5 * وقت . ثانية )
شارع <- 'Linux'
}
في الكود المذكور أعلاه ، استخدمنا ملف وقت النوم() تعمل داخل chan_str () وظيفة. فقط قناة الأسطوانات جاهزة للتنفيذ لأول 5 ثوانٍ. نتيجة لذلك ، فإن حدد البيان يدير القضية الفصل 1 .
انتاج |
ملحوظة: يمكنك إضافة تأخير لكلا القناتين لتأخير تنفيذ القنوات.
خاتمة
ال حدد البيان يسمح in Go باختيار وتنفيذ تعبير واحد من بين العديد من التعبيرات باستخدام مبدأ الانتظار ، حيث لن يتم تنفيذ العبارة حتى يتم الانتهاء من الاتصال. المبادئ التوجيهية المذكورة أعلاه تشمل حدد البيان النحو الأساسي والأمثلة.