ملخص - بناء أداة مساعدة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 57 من 68.
التحدي
سهلقم بإنشاء حزمة stringutil شاملة تحتوي على وظائف لمعالجة النصوص واستعرض استخدامها في برنامج رئيسي. سيختبر هذا التحدي قدرتك على إنشاء حزمة أدوات مخصصة، وتنفيذ وظائف مُصدرة (exported functions)، واستخدام حزمتك من برنامج آخر.
ستتلقى مدخلين:
- سلسلة نصية تحتوي على مواصفات الوظائف بتنسيق
"function1:description1,function2:description2"(على سبيل المثال،"Reverse:reverses a string,ToUpper:converts to uppercase,ToLower:converts to lowercase") - سلسلة نصية تحتوي على نصوص الاختبار مفصولة بعلامة الأنبوب بتنسيق
"string1|string2|string3"(على سبيل المثال،"hello|Go Programming|WORLD")
مهمتك هي:
- إنشاء حزمة
stringutilعن طريق التصريح عنpackage stringutil - تحليل المدخل الأول عن طريق تقسيمه عند الفواصل للحصول على مواصفات كل وظيفة على حدة
- لكل مواصفة وظيفة، قم بالتقسيم عند النقطتين الرأسيتين للحصول على اسم الوظيفة ووصفها
- تنفيذ الوظائف المُصدرة التالية في حزمة
stringutilالخاصة بك:Reverse(s string) string- تعيد النص مع ترتيب الأحرف بشكل عكسيToUpper(s string) string- تعيد النص محولاً إلى أحرف كبيرةToLower(s string) string- تعيد النص محولاً إلى أحرف صغيرةLength(s string) int- تعيد طول النص
- في برنامجك الرئيسي، قم باستيراد حزمة
stringutil - عرض ترويسة الحزمة:
"=== STRINGUTIL PACKAGE DEMONSTRATION ===" - عرض الوظائف المتاحة:
"Available functions in stringutil package:"- لكل وظيفة من المدخل الأول:
"- [function_name]: [description]"
- تحليل المدخل الثاني عن طريق تقسيمه عند علامة الأنبوب للحصول على نصوص الاختبار الفردية
- عرض ترويسة الاختبار:
"Testing stringutil functions:" - لكل نص اختبار، استعرض جميع الوظائف:
"Testing with: \"[test_string]\""" stringutil.Reverse: \"[reversed_result]\""" stringutil.ToUpper: \"[uppercase_result]\""" stringutil.ToLower: \"[lowercase_result]\""" stringutil.Length: [length_result]"
- حساب وعرض الإحصائيات:
"=== STATISTICS ===""Total test strings processed: [number_of_test_strings]""Functions available in package: [number_of_functions_from_first_input]""Total function calls made: [total_function_calls]"
- عرض أطول وأقصر النصوص:
"Longest string: \"[longest_string]\" (length: [length])""Shortest string: \"[shortest_string]\" (length: [length])"
- عرض رسالة الإتمام:
"Package demonstration completed successfully"
استخدم حزمة strings لتقسيم نصوص المدخلات ومعالجة النصوص، وحزمة fmt للمخرجات المنسقة. بالنسبة لوظيفة Reverse، ستحتاج إلى تحويل النص إلى شريحة (slice) من الـ runes، وعكس الترتيب، ثم التحويل مرة أخرى إلى نص. تذكر أن جميع الوظائف المُصدرة يجب أن تبدأ بأحرف كبيرة لتكون قابلة للوصول من الحزم الأخرى. يوضح هذا التحدي كيفية إنشاء حزم أدوات قابلة لإعادة الاستخدام وتنظيم الوظائف ذات الصلة معاً.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
// TODO: قم بإنشاء دوال حزمة stringutil الخاصة بك هنا
// بما أننا لا نستطيع استخدام ملفات منفصلة، قم بتعريف الدوال مباشرة
// هذه الدوال عادة ما تكون في ملف حزمة منفصل
// func Reverse(s string) string {
// // تحويل إلى runes، عكسها، ثم تحويلها مرة أخرى إلى string
// }
// func ToUpper(s string) string {
// // استخدم strings.ToUpper
// }
// func ToLower(s string) string {
// // استخدم strings.ToLower
// }
// func Length(s string) int {
// // إرجاع len(s)
// }
func main() {
// قراءة المدخلات باستخدام bufio.Scanner للتعامل مع المسافات بشكل صحيح
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
functionSpecs := scanner.Text()
scanner.Scan()
testStrings := scanner.Text()
// تحليل مواصفات الدوال
funcList := strings.Split(functionSpecs, ",")
// تحليل سلاسل الاختبار
testList := strings.Split(testStrings, "|")
// TODO: اكتب الكود الخاص بك أدناه
// 1. عرض ترويسة الحزمة
// 2. عرض الدوال المتاحة من funcList (تحقق من أطوال المصفوفة)
// 3. اختبار جميع الدوال مع كل سلسلة اختبار
// 4. حساب وعرض الإحصائيات
// 5. العثور على أطول/أقصر السلاسل وعرضها (تحقق مما إذا كانت testList تحتوي على عناصر)
// 6. عرض رسالة الإكمال
// تذكر استخدام دوال حزمة stringutil الخاصة بك مثل:
// Reverse(testString)
// ToUpper(testString)
// ToLower(testString)
// Length(testString)
}جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات6أسلوب Go الاصطلاحي: المجموعات
أسلوب المجموعات في Goإنشاء مجموعةالإضافة إلى مجموعةالتحقق من العضوية في المجموعةالحذف من مجموعةالتكرار عبر عناصر المجموعةمراجعة - أسماء مستخدمين فريدة9الحزم والنطاق
ما هي الحزمة؟المصدرة مقابل غير المصدرةإنشاء حزمة بسيطةالأسماء المستعارة للحزمالمعرف الفارغ `_`دالة `init`ملخص - بناء أداة مساعدة