التكرار

يمكنك العثور على جميع الشفرات المصدرية لهذا الفصل هنا

للقيام بالأشياء بشكل متكرر في Go، ستحتاج إلى for. في Go لا توجد كلمات رئيسية مثل while، do، until، يمكنك فقط استخدام for. وهو أمر جيد!

لنكتب اختبارًا لدالة تكرر الحرف 5 مرات.

لا يوجد شيء جديد حتى الآن، لذا حاول كتابته بنفسك للتدرب.

لنكتب الاختبار الاول

repeat_test.go
package iteration

import "testing"

func TestRepeat(t *testing.T) {
	repeated := Repeat("a")
	expected := "aaaaa"

	if repeated != expected {
		t.Errorf("expected %q but got %q", expected, repeated)
	}
}

حاول تشغيل الاختبار

terminal
./repeat_test.go:6:14: undefined: Repeat

اكتب الحد الأدنى من التعليمات البرمجية للاختبار ليتم تشغيله وتحقق من مخرجات الاختبار الفاشلة

حافظ على الانضباط! لست بحاجة إلى معرفة أي شيء جديد الآن حتى تجعل الاختبار يخفق بشكل صحيح.

كل ما عليك فعله الآن هو ما يكفي لترجمة البرنامج حتى تتمكن من التحقق من كتابة الاختبار بشكل جيد.

repeat.go
package iteration

func Repeat(character string) string {
	return ""
}

أليس من الجيد أن تعرف أنك متمكن بما يكفي بلغة Go لكتابة اختبارات لبعض المشكلات الأساسية؟ هذا يعني أنه يمكنك الآن اللعب بالشيفرة بقدر ما تريد وتعرف أن البرنامج يتصرف كما تتمنى.

terminal
repeat_test.go:10: expected 'aaaaa' but got ''

اكتب ما يكفي لنجاح الاختبار

بناء الجملة “for” عادي للغاية ويتبع معظم اللغات المشابهة للغة C.

repeat.go
func Repeat(character string) string {
	var repeated string
	for i := 0; i < 5; i++ {
		repeated = repeated + character
	}
	return repeated
}

على عكس اللغات الأخرى مثل C أو Java أو JavaScript، لا توجد أقواس تحيط بالمكونات الثلاثة لعبارة for، والأقواس المعقوفة { } مطلوبة دائمًا.

قد تتساءل عما يحدث في السطر

repeat.go
	var repeated string

كما كنا نستخدم := حتى الآن للاعلان عن المتغيرات وانشائها. ومع ذلك، := هو ببساطة اختصار لكلتا الخطوتين. نحن هنا نعلن عن متغير من نوع “سلسلة نصية” string فقط من دون انشاء. يمكننا أيضًا استخدام var للإعلان عن الدوال، كما سنرى لاحقًا.

قم بتشغيل الاختبار الان ويجب أن ينجح.

تم وصف الاشكال الاخرى الإضافية لـ for هنا.

إعادة الكتابة

حان الوقت الآن لإعادة كتابة الكود والتعرف على عامل آخر هو +=.

repeat.go
const repeatCount = 5

func Repeat(character string) string {
	var repeated string
	for i := 0; i < repeatCount; i++ {
		repeated += character
	}
	return repeated
}

+= يسمى “عامل الإضافة والاسناد”، يقوم باضافة المعامل الأيمن (character) إلى المعامل الأيسر (repeat) ومن ثم يقوم باسناد النتيجة إلى المعامل الأيسر. وهذا العامل يعمل مع أنواع أخرى مثل الأعداد الصحيحة وغيرها.

المعايرة (اختبار الاداء)

تعد كتابة الاختبارات المعايرية في Go ميزة أخرى من الدرجة الأولى (مدمجة) في اللغة وهي تشبه إلى حد كبير كتابة الاختبارات العادية.

repeat_test.go
func BenchmarkRepeat(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Repeat("a")
	}
}

سترى أن الكود مشابه جدًا للاختبار العادي.

يمنحك testing.B إمكانية الوصول إلى b.N.

عند تنفيذ الكود المعياري، يتم تشغيله عدد مرات قيمة N ويقيس المدة التي يستغرقها للتنفيذ.

لا ينبغي أن يهمك عدد مرات تشغيل الكود، حيث ستحدد Go القيمة “الجيدة” (b.N) تلقائياً للسماح لك بالحصول على بعض النتائج اللائقة.

لتشغيل الاختبار المعياري، قم بكتابة go test -bench=. (أو إذا كنت تستخدم Windows Powershell go test -bench=".")

terminal
goos: darwin
goarch: amd64
pkg: github.com/quii/learn-go-with-tests/for/v4
10000000           136 ns/op
PASS

ما يعنيه 136 ns/op هو أن دالتنا تستغرق في المتوسط 136 نانو ثانية لتشغيلها (على جهاز الكمبيوتر الخاص بي). وهو أمر جيد جدًا! تم تشغيل هذا الاختبار 10000000 مرة.

ملاحظة بشكل افتراضي يتم تشغيل الاختبارات المعيارية بشكل تسلسلي.

تمارين للممارسة

  • تغيير الاختبار حتى يتمكن المستخدم لدالتنا من تحديد عدد مرات تكرار الحرف ومن ثم إصلاح الكود
  • اكتب “ExampleRepeat” لتوثيق دالتك
  • قم بإلقاء نظرة على حزمة النصوص. ابحث عن الدوال التي تعتقد أنها قد تكون مفيدة وقم بتجربتها من خلال كتابة اختبارات مثل التي لدينا هنا. إن استثمار الوقت في تعلم المكتبة القياسية سيؤتي ثماره بمرور الوقت.

ختامًا

  • المزيد من ممارسة TDD
  • تعلمنا “for”.
  • تعلمنا كيفية كتابة الاختبارات المعيارية