تقديم Go و Mggo Framework

مرحبا بالجميع! أريد أن أشارك أول تجربة برمجة في Go.

بدأت طريقي إلى البرمجة كمطور للواجهة الأمامية. ثم انتقلت إلى الواجهة الخلفية في بيثون ، وقليلا لنفسي ، إلى C # Asp.Net MVC. لكن في الآونة الأخيرة ، قبل شهرين ، قابلت هذه اللغة الجميلة Go.

لماذا تذهب؟


1 - لغة مترجمة.
2 هي لغة غير عادية للغاية.

الهياكل ، واجهات ... اضطررت إلى كسر ذهني ، وتعلم. والمشكلة الأولى ، أكثر ، هي إعادة التعلم. أين هي الطبقات؟ أين هو OOP؟ أين هي الأنماط المفضلة لديك؟

ولكن كسر رأسي قليلاً ، تم الكشف عن لغة "جو" ووقعت في حبها. حسنًا ، بالطبع ، أول ما قررت أن أكتب أول "دراجة" له ، وهي إطار الويب الذي يسمى MGGO.

ما أردت وما تطمح إليه


بالطبع ، أردت على الفور إنشاء إطار عمل MVC مثل Asp.Net. لكن اتضح أنها ليست بهذه البساطة ، لأن لغة Go غريبة. ولكن هنا ما حدث:

وحدات التحكم (تحكم)


وحدة التحكم هي بنية يمكن أن تكون الطرق فيها خارجية (api) وداخلية فقط ، وكذلك تلك المسؤولة عن العرض.

على الفور على سبيل المثال ، النظر في وحدة تحكم الأخبار.

import mggo type News struct{ ID int Title string Text string } func NewNews() *NewNews{ return &NewNews{} } func init() { //   mggo.RegisterController("news", NewNews) } func(n *News) Read(ctx *mggo.BaseContext) News{ return News{1, "First News", "Text first News"} } func(n *News) IndexView(ctx *mggo.BaseContext, data *mggo.ViewData, path []string){ data.View = "news/news.html" data.Data["News"] data.Data["News"] = n.Read() } 


بعد ذلك ، تتوفر الأخبار على / news /

حيث يكون news هو اسم وحدة التحكم ، وتكون الصفحة الرئيسية هي index ، والتي تكون طريقة IndexView مسؤولة عنها.

الآن عن api. لدى وحدة التحكم News طريقة قراءة. بشكل افتراضي ، إنها الخدمة فقط. من أجل السماح بطلب api لهذه الطريقة ، تحتاج إلى إضافة حقوق إلى الطريقة في وظيفة التحكم "init".

 func init(){ ... mggo.AppendRight("News.Read", mggo.RRightGuest) } 

بعد ذلك ، تتوفر طريقة القراءة لاستدعاء api لأي مستخدم.

 fetch("/api/", { "method": "POST", "headers": { 'Accept': 'application/json', 'Content-Type': 'application/json' }, "body": JSON.stringify({ "method": "News.Read", "params": {} }) }).then(res => res.Json()).then(console.log) 

يؤدي

 {result: {ID:1, Title:"First News", Text:"Text first News"}} 

قليلا عن المعلمات. سيتم تمرير جميع المعلمات داخل كائن params كحقول بنية.

على سبيل المثال ، دعونا نقوم بتعديل وظيفة القراءة قليلاً:

 func(n *News) Read(ctx *mggo.BaseContext) News{ if n.ID ==1 { return News{1, "First News", "Text first News"} } else { return News{} } } 

ويجب أن تكون استدعاء api بمعرف المعلمة: 1 - params {ID: 1})

ماذا بعد؟


كيو. يتم توصيل مكتبة Go-pg في الإطار. دعونا الحصول على مثال على الفور. تحكم الأخبار لدينا لديه بيانات ثابتة. يحتاج إلى تغيير. للقيام بذلك ، أول ما عليك فعله هو إنشاء جدول أخبار. إضافة بضعة أسطر إلى الدالة init.

 func init(){ ... mggo.InitCallback(func(){ mggo.CreateTable([]interface{}{(*News)(nil)}) }) } 

الآن ، بعد التهيئة ، نحصل على جدول الأخبار ، بهوية الحقول والعنوان والنص.

تغيير طريقة القراءة:

 func(n *News) Read(ctx *mggo.BaseContext) News{ mggo.SQL().Select(n) return *n } 

إذا قمنا باستدعاء أسلوب News.Read بمعرف المعلمة: 1 ، فنتيجة لذلك نحصل على البيانات من جدول الأخبار باستخدام المفتاح 1.

يمكن الاطلاع على ميزات Go-pg في الوثائق .

لكن هذا ليس كل شيء. لا يمكن وصف كل شيء هنا. نأمل أن أكتب ونشر وثائق مفصلة قريبا. فيما يلي ملخص موجز لما يمكن أن تفعله Mggo.

⁃ مآخذ الويب
⁃ أحداث الخادم والعميل
method نتائج طريقة التخزين المؤقت
calls دعم المكالمات JsonRPC
⁃ Liba للتحكم السريع وإنشاء العرض

هذا كل شيء الآن. آمل أن يجد شخص ما المادة مفيدة. بالطبع ، هناك مجموعة من الأطر الأخرى الجاهزة والرائعة. أردت فقط أن أحاول القيام بشيء خاص بي لتجربتي الشخصية.

رابط للمشروع

رابط إلى مثال وبداية سريعة

Source: https://habr.com/ru/post/ar456472/


All Articles