Go بالأمثلة: الأنواع المعددة (Enums)

الأنواع المعددة (Enums) هي حالة خاصة من أنواع المجموع. النوع المعدد هو نوع له عدد محدد من القيم الممكنة، ولكل منها اسم مميز. لا تمتلك Go نوع enum كخاصية لغوية منفصلة، ولكن من السهل تطبيقها باستخدام اصطلاحات اللغة الحالية.

package main

import "fmt"

النوع المعدد ServerState الخاص بنا له نوع أساسي هو int.

type ServerState int

القيم الممكنة لـ ServerState يتم تعريفها كثوابت. الكلمة المحجوزة الخاصة iota تولد قيم ثوابت متتالية تلقائياً؛ في هذه الحالة 0، 1، 2 وهكذا.

const (
    StateIdle ServerState = iota
    StateConnected
    StateError
    StateRetrying
)

من خلال تطبيق واجهة fmt.Stringer يمكن طباعة قيم ServerState أو تحويلها إلى نصوص.

var stateName = map[ServerState]string{
    StateIdle:      "idle",
    StateConnected: "connected",
    StateError:     "error",
    StateRetrying:  "retrying",
}

func (ss ServerState) String() string {
    return stateName[ss]
}

func main() {
    ns := transition(StateIdle)
    fmt.Println(ns)

    ns2 := transition(ns)
    fmt.Println(ns2)
}

دالة transition تحاكي انتقال الحالة للخادم؛ تأخذ الحالة الحالية وتعيد حالة جديدة.

func transition(s ServerState) ServerState {
    switch s {
    case StateIdle:
        return StateConnected
    case StateConnected, StateRetrying:

نفترض أننا نتحقق من بعض الشروط هنا لتحديد الحالة التالية…

        return StateIdle
    case StateError:
        return StateError
    default:
        panic(fmt.Errorf("حالة غير معروفة: %s", s))
    }
}

تشغيل البرنامج:

$ go run enums.go
connected
idle

المثال التالي: تضمين الهياكل (Struct Embedding).