في لغة Go، تكون عبارة select مثل عبارة switch ، ولكن في عبارة select، تشير عبارة case إلى الاتصال، أي عملية الإرسال أو الاستقبال على القناة.

بناء الجملة:
select{
case SendOrReceive1: // Lệnh
case SendOrReceive2: // Lệnh
case SendOrReceive3: // Lệnh
.......
default: // Lệnh
في هذه المقالة سوف نتعلم كيفية استخدام الحالة الافتراضية لتجنب الجمود. ولكن أولاً، دعونا نكتشف ما هي حالة الجمود عند استخدام أمر تحديد Golang ؟
أشياء يجب معرفتها عن حالة الجمود في لغة جولانج
الجمود: عندما تحاول قراءة أو كتابة البيانات من قناة ولكن القناة فارغة. وبالتالي، فإنه يمنع التنفيذ الحالي للروتين ويمرر التحكم إلى روتينات أخرى، ولكن إذا لم يتوفر أي روتين آخر أو كانت الروتينات الأخرى في وضع الراحة بسبب هذا الموقف، فسوف يتعطل البرنامج. هذه الظاهرة تسمى الجمود. كما هو موضح في المثال أدناه:
على سبيل المثال:
// Chương trình Go minh hoạc
// cách deadlock phát sinh
package main
// Hàm chính
func main() {
// Tạo một kênh
// Deadlock phát sinh bởi
// không có goroutine đang viết
// vào kênh này, vì thế
// lệnh select đã bị khóa mãi mãi
c := make(chan int)
select {
case <-c: }="" }="">
نتيجة:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
لتجنب هذا الموقف، نستخدم الحالة الافتراضية في عبارة التحديد. بعبارة أخرى، عندما يحدث الجمود في البرنامج، يتم تنفيذ الحالة الافتراضية لعبارة select لتجنب الجمود. كما هو الحال في المثال أدناه، نستخدم الحالة الافتراضية في عبارة التحديد لتجنب الجمود.
على سبيل المثال:
// Chương trình Go minh họa cách giải quyết
// vấn đề deadlock bằng case mặc định
package main
import "fmt"
// Hàm chính
func main() {
// Tạo 1 kênh
c := make(chan int)
select {
case <-c: default:="" fmt.println("!..="" default="" case..!")="" }="" }="">
نتيجة:
!.. Default case..!
يُسمح لك أيضًا باستخدام الحالة الافتراضية عندما تحتوي عبارة select على قناة فارغة فقط . كما هو موضح في المثال أدناه، القناة c هي صفر، لذلك يتم تنفيذ الحالة الافتراضية إذا لم تكن الحالة الافتراضية هنا متاحة، ثم سيتم حظر البرنامج إلى الأبد وينشأ الجمود.
على سبيل المثال:
// Chương trình Go minh họa
// chạy case mặc định
package main
import "fmt"
// Hàm chính
func main() {
// Tạo một kênh
var c chan int
select {
case x1 := <-c: fmt.println("value:="" ",="" x1)="" default:="" fmt.println("default="" case..!")="" }="" }="">
نتيجة:
Default case..!