<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>أساسيات Go on تعلّم Go بالاختبارات</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/</link><description>Recent content in أساسيات Go on تعلّم Go بالاختبارات</description><generator>Hugo</generator><language>ar</language><atom:link href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/index.xml" rel="self" type="application/rss+xml"/><item><title>تثبيت Go وتجهيز بيئة عمل منتجة</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/install-go/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/install-go/</guid><description>&lt;h1 id="تثبيت-go-وتجهيز-بيئة-عمل-منتجة"&gt;تثبيت Go وتجهيز بيئة عمل منتجة&lt;a class="anchor" href="#%d8%aa%d8%ab%d8%a8%d9%8a%d8%aa-go-%d9%88%d8%aa%d8%ac%d9%87%d9%8a%d8%b2-%d8%a8%d9%8a%d8%a6%d8%a9-%d8%b9%d9%85%d9%84-%d9%85%d9%86%d8%aa%d8%ac%d8%a9"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;تعليمات تثبيت Go الرسمية متاحة &lt;a href="https://golang.org/doc/install"&gt;هنا&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="بيئة-go"&gt;بيئة Go&lt;a class="anchor" href="#%d8%a8%d9%8a%d8%a6%d8%a9-go"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;h3 id="وحدات-go-modules"&gt;وحدات Go (Modules)&lt;a class="anchor" href="#%d9%88%d8%ad%d8%af%d8%a7%d8%aa-go-modules"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;أضافت Go 1.11 &lt;a href="https://go.dev/wiki/Modules"&gt;الوحدات&lt;/a&gt;، وهي وضع البناء الافتراضي منذ Go 1.16، لذلك لا يُنصح باستخدام &lt;code&gt;GOPATH&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;تحل الوحدات مشكلات إدارة الاعتماديات (dependencies) واختيار الإصدارات والبناء القابل للتكرار (reproducible builds)، كما أنها تتيح تشغيل كود Go خارج &lt;code&gt;GOPATH&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;قليل من السياق: ماذا كان قبل الوحدات؟&lt;/strong&gt; قبل Go 1.11، كانت أدوات Go تعتمد على قاعدة اسمها &lt;code&gt;GOPATH&lt;/code&gt;، وهو متغير بيئة يشير إلى مجلد واحد على جهازك (عادة &lt;code&gt;~/go&lt;/code&gt;) يجب أن يعيش داخله كل كود Go. كل مشروع وكل اعتمادية وكل حزمة مترجَمة كانت تُخزَّن تحت ذلك المجلد. أي أنك لم تكن تستطيع إنشاء مجلد في أي مكان والبدء في كتابة Go، لأن المترجم لن يعرف كيف يحل الـ imports خارج &lt;code&gt;GOPATH&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>مرحبًا بالعالم</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/hello-world/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/hello-world/</guid><description>&lt;h1 id="مرحبا-بالعالم"&gt;مرحبًا بالعالم&lt;a class="anchor" href="#%d9%85%d8%b1%d8%ad%d8%a8%d8%a7-%d8%a8%d8%a7%d9%84%d8%b9%d8%a7%d9%84%d9%85"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/hello-world"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;من التقاليد أن يكون أول برنامج تكتبه بأي لغة جديدة هو &lt;a href="https://en.m.wikipedia.org/wiki/%22Hello,_World!%22_program"&gt;Hello, World&lt;/a&gt;.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;أنشئ مجلدًا في أي مكان تريده&lt;/li&gt;&#10;&lt;li&gt;ضع داخله ملفًا جديدًا اسمه &lt;code&gt;hello.go&lt;/code&gt; واكتب فيه الكود التالي&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello, world&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ولتشغيله اكتب &lt;code&gt;go run hello.go&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="كيف-يعمل-هذا"&gt;كيف يعمل هذا؟&lt;a class="anchor" href="#%d9%83%d9%8a%d9%81-%d9%8a%d8%b9%d9%85%d9%84-%d9%87%d8%b0%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;عند كتابة برنامج في Go، سيكون لديك حزمة &lt;code&gt;main&lt;/code&gt; معرَّفة بداخلها دالة &lt;code&gt;main&lt;/code&gt;. والحزم (packages) هي طريقة لتجميع كود Go المرتبط ببعضه.&lt;/p&gt;</description></item><item><title>الأعداد الصحيحة</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/integers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/integers/</guid><description>&lt;h1 id="الأعداد-الصحيحة"&gt;الأعداد الصحيحة&lt;a class="anchor" href="#%d8%a7%d9%84%d8%a3%d8%b9%d8%af%d8%a7%d8%af-%d8%a7%d9%84%d8%b5%d8%ad%d9%8a%d8%ad%d8%a9"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/integers"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;تعمل الأعداد الصحيحة كما تتوقع. لنكتب دالة &lt;code&gt;Add&lt;/code&gt; لتجربة الأمر. أنشئ ملف اختبار اسمه &lt;code&gt;adder_test.go&lt;/code&gt; واكتب فيه هذا الكود.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ملاحظة:&lt;/strong&gt; يمكن لملفات مصدر Go أن تحتوي على &lt;code&gt;package&lt;/code&gt; واحدة فقط لكل مجلد. تأكد من تنظيم ملفاتك في حزم خاصة بها. &lt;a href="https://dave.cheney.net/2014/12/01/five-suggestions-for-setting-up-a-go-project"&gt;إليك شرحًا جيدًا لهذا.&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;ورُبما يبدو مجلد مشروعك هكذا:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;learnGoWithTests&#10; |&#10; |-&amp;gt; helloworld&#10; | |- hello.go&#10; | |- hello_test.go&#10; |&#10; |-&amp;gt; integers&#10; | |- adder_test.go&#10; |&#10; |- go.mod&#10; |- README.md&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="اكتب-الاختبار-أولا"&gt;اكتب الاختبار أولًا&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d8%a3%d9%88%d9%84%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;integers&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;TestAdder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;expected &amp;#39;%d&amp;#39; but got &amp;#39;%d&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ستلاحظ أننا نستخدم &lt;code&gt;%d&lt;/code&gt; بدلًا من &lt;code&gt;%q&lt;/code&gt; في نصوص التنسيق، لأننا نريد طباعة عدد صحيح لا نص.&lt;/p&gt;</description></item><item><title>التكرار</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/iteration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/iteration/</guid><description>&lt;h1 id="التكرار"&gt;التكرار&lt;a class="anchor" href="#%d8%a7%d9%84%d8%aa%d9%83%d8%b1%d8%a7%d8%b1"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/for"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;لتكرار عمل ما في Go، ستحتاج إلى &lt;code&gt;for&lt;/code&gt;. فلا توجد في Go كلمات مفتاحية مثل &lt;code&gt;while&lt;/code&gt; و&lt;code&gt;do&lt;/code&gt; و&lt;code&gt;until&lt;/code&gt;، وكل ما يمكنك استخدامه هو &lt;code&gt;for&lt;/code&gt;. وهذا شيء جيد!&lt;/p&gt;&#10;&lt;p&gt;لنكتب اختبارًا لدالة تكرر حرفًا خمس مرات.&lt;/p&gt;&#10;&lt;p&gt;لا يوجد جديد حتى الآن، لذا جرّب كتابته بنفسك للتدريب.&lt;/p&gt;&#10;&lt;h2 id="اكتب-الاختبار-أولا"&gt;اكتب الاختبار أولًا&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d8%a3%d9%88%d9%84%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;iteration&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;TestRepeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;repeated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;aaaaa&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;repeated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;expected %q but got %q&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;repeated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="جرب-تشغيل-الاختبار"&gt;جرّب تشغيل الاختبار&lt;a class="anchor" href="#%d8%ac%d8%b1%d8%a8-%d8%aa%d8%b4%d8%ba%d9%8a%d9%84-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;./repeat_test.go:6:14: undefined: Repeat&lt;/code&gt;&lt;/p&gt;</description></item><item><title>المصفوفات والشرائح</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/arrays-and-slices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/arrays-and-slices/</guid><description>&lt;h1 id="المصفوفات-والشرائح"&gt;المصفوفات والشرائح&lt;a class="anchor" href="#%d8%a7%d9%84%d9%85%d8%b5%d9%81%d9%88%d9%81%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d8%b4%d8%b1%d8%a7%d8%a6%d8%ad"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/arrays"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;تتيح لك المصفوفات (arrays) تخزين عدة عناصر من النوع نفسه في متغير واحد بترتيب معين.&lt;/p&gt;&#10;&lt;p&gt;وعندما يكون لديك مصفوفات، فمن الشائع جدًا أن تحتاج إلى المرور عليها عنصرًا عنصرًا. لذا دعنا نستخدم &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/iteration/"&gt;معرفتنا الجديدة بـ &lt;code&gt;for&lt;/code&gt;&lt;/a&gt; لبناء دالة &lt;code&gt;Sum&lt;/code&gt; تأخذ مصفوفة أرقام وتُرجع المجموع.&lt;/p&gt;&#10;&lt;p&gt;لنستخدم مهاراتنا في التطوير الموجه بالاختبار.&lt;/p&gt;&#10;&lt;h2 id="اكتب-الاختبار-أولا"&gt;اكتب الاختبار أولًا&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d8%a3%d9%88%d9%84%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;أنشئ مجلدًا جديدًا للعمل فيه. ثم أنشئ ملفًا جديدًا اسمه &lt;code&gt;sum_test.go&lt;/code&gt; وضع فيه ما يلي:&lt;/p&gt;</description></item><item><title>Structs والـ Methods والـ Interfaces</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/structs-methods-and-interfaces/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/structs-methods-and-interfaces/</guid><description>&lt;h1 id="structs-والـ-methods-والـ-interfaces"&gt;Structs والـ Methods والـ Interfaces&lt;a class="anchor" href="#structs-%d9%88%d8%a7%d9%84%d9%80-methods-%d9%88%d8%a7%d9%84%d9%80-interfaces"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/structs"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;لنفترض أننا نحتاج إلى بعض كود الهندسة لحساب محيط مستطيل بمعلومية الارتفاع والعرض. يمكننا كتابة دالة &lt;code&gt;Perimeter(width float64, height float64)&lt;/code&gt;، حيث &lt;code&gt;float64&lt;/code&gt; مخصصة للأعداد العشرية مثل &lt;code&gt;123.45&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;ومن المفترض أن تكون دورة التطوير الموجه بالاختبار مألوفة لك تمامًا الآن.&lt;/p&gt;&#10;&lt;h2 id="اكتب-الاختبار-أولا"&gt;اكتب الاختبار أولًا&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d8%a3%d9%88%d9%84%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;TestPerimeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Perimeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;40.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;got %.2f want %.2f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هل لاحظت نص التنسيق الجديد؟ الحرف &lt;code&gt;f&lt;/code&gt; مخصص لـ &lt;code&gt;float64&lt;/code&gt;، و&lt;code&gt;.2&lt;/code&gt; تعني طباعة منزلتين عشريتين.&lt;/p&gt;</description></item><item><title>المؤشرات والأخطاء</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/pointers-and-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/pointers-and-errors/</guid><description>&lt;h1 id="المؤشرات-والأخطاء"&gt;المؤشرات والأخطاء&lt;a class="anchor" href="#%d8%a7%d9%84%d9%85%d8%a4%d8%b4%d8%b1%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d8%a3%d8%ae%d8%b7%d8%a7%d8%a1"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/pointers"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;تعرّفنا في القسم السابق على الـ structs التي تتيح لنا تجميع عدد من القيم المرتبطة بمفهوم واحد.&lt;/p&gt;&#10;&lt;p&gt;وقد ترغب في مرحلة ما في استخدام الـ structs لإدارة الحالة (state)، مع كشف methods تتيح للمستخدمين تغيير تلك الحالة بالطريقة التي تتحكم بها أنت.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;قطاع التقنية المالية (fintech) يعشق Go&lt;/strong&gt; و&amp;hellip; البيتكوين؟ فلنُظهر إذن ما يمكننا بناؤه من نظام مصرفي مذهل.&lt;/p&gt;&#10;&lt;p&gt;لننشئ struct اسمه &lt;code&gt;Wallet&lt;/code&gt; يتيح لنا إيداع &lt;code&gt;Bitcoin&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>الـ Maps</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/maps/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/maps/</guid><description>&lt;h1 id="الـ-maps"&gt;الـ Maps&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-maps"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/maps"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;في &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/arrays-and-slices/"&gt;المصفوفات والشرائح&lt;/a&gt;، رأيت كيف تخزّن القيم بالترتيب. والآن سننظر إلى طريقة لتخزين العناصر حسب &lt;code&gt;key&lt;/code&gt; (مفتاح) والبحث عنها بسرعة.&lt;/p&gt;&#10;&lt;p&gt;تتيح لك الـ Maps تخزين العناصر بطريقة تشبه القاموس؛ فيمكنك التفكير في الـ &lt;code&gt;key&lt;/code&gt; كأنها الكلمة، وفي الـ &lt;code&gt;value&lt;/code&gt; كأنه التعريف. وهل توجد طريقة أفضل لتعلّم الـ Maps من بناء قاموسنا الخاص؟&lt;/p&gt;&#10;&lt;p&gt;أولًا، بافتراض أن لدينا بالفعل بعض الكلمات وتعريفاتها في القاموس، فإذا بحثنا عن كلمة ينبغي أن يُرجع لنا تعريفها.&lt;/p&gt;</description></item><item><title>حقن الاعتماديات (Dependency Injection)</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/dependency-injection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/dependency-injection/</guid><description>&lt;h1 id="حقن-الاعتماديات-dependency-injection"&gt;حقن الاعتماديات (Dependency Injection)&lt;a class="anchor" href="#%d8%ad%d9%82%d9%86-%d8%a7%d9%84%d8%a7%d8%b9%d8%aa%d9%85%d8%a7%d8%af%d9%8a%d8%a7%d8%aa-dependency-injection"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/di"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;من المفترض أنك قرأت &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/structs-methods-and-interfaces/"&gt;فصل الـ structs&lt;/a&gt; من قبل، لأننا سنحتاج إلى بعض الفهم للـ interfaces هنا.&lt;/p&gt;&#10;&lt;p&gt;هناك &lt;em&gt;الكثير&lt;/em&gt; من سوء الفهم حول حقن الاعتماديات في أوساط البرمجة. آمل أن يوضح لك هذا الدليل أنّ:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;لا تحتاج إلى إطار عمل (framework)&lt;/li&gt;&#10;&lt;li&gt;وأنه لا يزيد تصميمك تعقيدًا&lt;/li&gt;&#10;&lt;li&gt;وأنه يسهّل الاختبار&lt;/li&gt;&#10;&lt;li&gt;وأنه يتيح لك كتابة دوال عامة رائعة.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;نريد كتابة دالة تسلّم على شخص، تمامًا كما فعلنا في فصل hello-world، لكننا هذه المرة سنختبر &lt;em&gt;الطباعة الفعلية&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>الـ Mocking</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/mocking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/mocking/</guid><description>&lt;h1 id="الـ-mocking"&gt;الـ Mocking&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-mocking"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/mocking"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;طُلب منك كتابة برنامج يعدّ تنازليًا من 3، ويطبع كل رقم في سطر جديد (مع توقف لمدة ثانية واحدة)، وعندما يصل إلى الصفر يطبع &amp;ldquo;Go!&amp;rdquo; ويخرج.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;3&#10;2&#10;1&#10;Go!&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;سنعالج هذا بكتابة دالة اسمها &lt;code&gt;Countdown&lt;/code&gt; ثم نضعها داخل برنامج &lt;code&gt;main&lt;/code&gt; ليصبح الأمر هكذا:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nf"&gt;Countdown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ومع أن هذا برنامج بسيط للغاية، فإن اختباره اختبارًا كاملًا سيقتضي منا كما في كل مرة اتباع منهج &lt;em&gt;تكراري&lt;/em&gt; و_موجه بالاختبار_.&lt;/p&gt;</description></item><item><title>التزامن (Concurrency)</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/concurrency/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/concurrency/</guid><description>&lt;h1 id="التزامن-concurrency"&gt;التزامن (Concurrency)&lt;a class="anchor" href="#%d8%a7%d9%84%d8%aa%d8%b2%d8%a7%d9%85%d9%86-concurrency"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/concurrency"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;إليك البداية: كتب زميل لك دالة اسمها &lt;code&gt;CheckWebsites&lt;/code&gt; تفحص حالة قائمة من عناوين URL.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;concurrency&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WebsiteChecker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;CheckWebsites&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WebsiteChecker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;wc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;تُرجع الدالة خريطة (map) تربط كل عنوان URL تم فحصه بقيمة منطقية (boolean): &lt;code&gt;true&lt;/code&gt; لاستجابة جيدة، و&lt;code&gt;false&lt;/code&gt; لاستجابة سيئة.&lt;/p&gt;</description></item><item><title>الـ Select</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/select/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/select/</guid><description>&lt;h1 id="الـ-select"&gt;الـ Select&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-select"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/select"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;طُلب منك أن تكتب دالة اسمها &lt;code&gt;WebsiteRacer&lt;/code&gt; تأخذ رابطين (URLs) و&amp;quot;تتسابق&amp;quot; بينهما بإرسال طلب HTTP GET إلى كل منهما، ثم تُرجع الرابط الذي عاد أولًا. وإذا لم يعد أي منهما خلال 10 ثوانٍ، فعليها أن تُرجع &lt;code&gt;error&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;ولهذا سنستخدم:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;net/http&lt;/code&gt; لإجراء استدعاءات HTTP.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;net/http/httptest&lt;/code&gt; لمساعدتنا في اختبارها.&lt;/li&gt;&#10;&lt;li&gt;الـ goroutines.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;select&lt;/code&gt; لمزامنة العمليات.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="اكتب-الاختبار-أولا"&gt;اكتب الاختبار أولًا&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d8%a3%d9%88%d9%84%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;لنبدأ بشيء بسيط (naive) لننطلق منه.&lt;/p&gt;</description></item><item><title>الـ Reflection</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/reflection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/reflection/</guid><description>&lt;h1 id="الـ-reflection"&gt;الـ Reflection&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-reflection"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/reflection"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://x.com/peterbourgon/status/1011403901419937792?s=09"&gt;من X&lt;/a&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;تحدي golang: اكتب دالة &lt;code&gt;walk(x interface{}, fn func(string))&lt;/code&gt; تأخذ struct اسمه &lt;code&gt;x&lt;/code&gt; وتستدعي &lt;code&gt;fn&lt;/code&gt; على كل حقول النصوص الموجودة بداخله. مستوى الصعوبة: العودية.&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;لفعل ذلك سنحتاج إلى استخدام &lt;em&gt;الـ Reflection&lt;/em&gt;.&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;الـ Reflection في الحوسبة هو قدرة برنامج على فحص بنيته الخاصة، ولا سيما عبر الأنواع؛ وهو شكل من أشكال البرمجة الفوقية (metaprogramming). وهو أيضًا مصدر كبير للحيرة.&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;من &lt;a href="https://blog.golang.org/laws-of-reflection"&gt;مدونة Go: الـ Reflection&lt;/a&gt;&lt;/p&gt;</description></item><item><title>الـ Sync</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/sync/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/sync/</guid><description>&lt;h1 id="الـ-sync"&gt;الـ Sync&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-sync"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/sync"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;نريد أن نصنع عدّادًا (counter) يمكن استخدامه بأمان في الـ concurrency.&lt;/p&gt;&#10;&lt;p&gt;سنبدأ بعدّاد غير آمن ونتحقق من أن سلوكه سليم في بيئة أحادية الـ thread.&lt;/p&gt;&#10;&lt;p&gt;ثم نستعرض عدم أمانه عبر اختبار تُحاول فيه عدة goroutines استخدام العدّاد في الوقت نفسه، ثم نصلح المشكلة.&lt;/p&gt;&#10;&lt;h2 id="اكتب-الاختبار-أولا"&gt;اكتب الاختبار أولًا&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d8%a3%d9%88%d9%84%d8%a7"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;نريد أن تمنحنا واجهة برمجتنا (API) method لزيادة العدّاد ثم استرجاع قيمته.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;TestCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;incrementing the counter 3 times leaves it at 3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;got %d, want %d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="جرب-تشغيل-الاختبار"&gt;جرّب تشغيل الاختبار&lt;a class="anchor" href="#%d8%ac%d8%b1%d8%a8-%d8%aa%d8%b4%d8%ba%d9%8a%d9%84-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;./sync_test.go:9:14: undefined: Counter&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="اكتب-أصغر-قدر-من-الكود-ليعمل-الاختبار-وافحص-مخرجاته-الفاشلة"&gt;اكتب أصغر قدر من الكود ليعمل الاختبار وافحص مخرجاته الفاشلة&lt;a class="anchor" href="#%d8%a7%d9%83%d8%aa%d8%a8-%d8%a3%d8%b5%d8%ba%d8%b1-%d9%82%d8%af%d8%b1-%d9%85%d9%86-%d8%a7%d9%84%d9%83%d9%88%d8%af-%d9%84%d9%8a%d8%b9%d9%85%d9%84-%d8%a7%d9%84%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1-%d9%88%d8%a7%d9%81%d8%ad%d8%b5-%d9%85%d8%ae%d8%b1%d8%ac%d8%a7%d8%aa%d9%87-%d8%a7%d9%84%d9%81%d8%a7%d8%b4%d9%84%d8%a9"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;لنعرّف &lt;code&gt;Counter&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>الـ Context</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/context/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/context/</guid><description>&lt;h1 id="الـ-context"&gt;الـ Context&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-context"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/context"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;كثيرًا ما تُطلق البرمجيات عمليات طويلة الأمد وشرهة للموارد (وغالبًا في صورة goroutines). وإذا أُلغيت العملية التي تسببت في ذلك أو فشلت لسبب ما، فستحتاج إلى إيقاف هذه العمليات بطريقة متسقة في كل أنحاء تطبيقك.&lt;/p&gt;&#10;&lt;p&gt;وإذا لم تدِر ذلك، فقد يبدأ تطبيقك الـ Go السريع الذي تفتخر به في الظهور بمشكلات أداء يصعب تتبعها.&lt;/p&gt;&#10;&lt;p&gt;في هذا الفصل سنستخدم حزمة &lt;code&gt;context&lt;/code&gt; لمساعدتنا في إدارة العمليات طويلة الأمد.&lt;/p&gt;</description></item><item><title>مقدمة إلى الاختبارات القائمة على الخصائص (Property Based Tests)</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/roman-numerals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/roman-numerals/</guid><description>&lt;h1 id="الأرقام-الرومانية"&gt;الأرقام الرومانية&lt;a class="anchor" href="#%d8%a7%d9%84%d8%a3%d8%b1%d9%82%d8%a7%d9%85-%d8%a7%d9%84%d8%b1%d9%88%d9%85%d8%a7%d9%86%d9%8a%d8%a9"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/roman-numerals"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;قد تطلب بعض الشركات منك أداء &lt;a href="http://codingdojo.org/kata/RomanNumerals/"&gt;تمرين الأرقام الرومانية (Roman Numeral Kata)&lt;/a&gt; ضمن عملية المقابلة. وسيوضح لك هذا الفصل كيف تتعامل معه مستعينًا بالتطوير الموجه بالاختبار (TDD).&lt;/p&gt;&#10;&lt;p&gt;سنكتب دالة تحوّل &lt;a href="https://en.wikipedia.org/wiki/Arabic_numerals"&gt;عددًا عربيًا&lt;/a&gt; (الأعداد من 0 إلى 9) إلى رقم روماني.&lt;/p&gt;&#10;&lt;p&gt;إن لم تكن قد سمعت عن &lt;a href="https://en.wikipedia.org/wiki/Roman_numerals"&gt;الأرقام الرومانية&lt;/a&gt;، فهي الطريقة التي كان الرومان يكتبون بها الأعداد.&lt;/p&gt;&#10;&lt;p&gt;تبنيها بلصق رموز بعضها ببعض، وتلك الرموز تمثل أعدادًا.&lt;/p&gt;</description></item><item><title>الرياضيات</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/math/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/math/</guid><description>&lt;h1 id="الرياضيات"&gt;الرياضيات&lt;a class="anchor" href="#%d8%a7%d9%84%d8%b1%d9%8a%d8%a7%d8%b6%d9%8a%d8%a7%d8%aa"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/math"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;مهما بلغت قوة الحواسيب الحديثة في إجراء عمليات جمع هائلة بسرعة البرق، فنادرًا ما يستخدم المطور العادي أي رياضيات في عمله. لكن ليس اليوم! سنستخدم اليوم الرياضيات لحل مشكلة &lt;em&gt;حقيقية&lt;/em&gt;. وليست رياضيات مملة - سنستخدم حساب المثلثات والمتجهات وكل تلك الأشياء التي كنت تقول دائمًا إنك لن تحتاج إليها بعد الثانوية.&lt;/p&gt;&#10;&lt;h2 id="المشكلة"&gt;المشكلة&lt;a class="anchor" href="#%d8%a7%d9%84%d9%85%d8%b4%d9%83%d9%84%d8%a9"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;تريد أن تصنع صورة SVG لساعة. لا ساعة رقمية - لا، فتلك ستكون سهلة - بل ساعة &lt;em&gt;عقارب&lt;/em&gt;، لها عقارب. ولا تبحث عن شيء فخم، فقط دالة لطيفة تأخذ &lt;code&gt;Time&lt;/code&gt; من حزمة &lt;code&gt;time&lt;/code&gt; وتُخرج SVG لساعة بكل عقاربها - الساعات والدقائق والثواني - مشيرة في الاتجاه الصحيح. فما مدى صعوبة ذلك؟&lt;/p&gt;</description></item><item><title>قراءة الملفات</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/reading-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/reading-files/</guid><description>&lt;h1 id="قراءة-الملفات"&gt;قراءة الملفات&lt;a class="anchor" href="#%d9%82%d8%b1%d8%a7%d8%a1%d8%a9-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/reading-files"&gt;&lt;strong&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=nXts4dEJnkU"&gt;هذا فيديو لي وأنا أعمل على المسألة وأجيب عن أسئلة بث Twitch&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;في هذا الفصل سنتعلم كيف نقرأ بعض الملفات، ونستخرج منها بعض البيانات، ونفعل شيئًا مفيدًا.&lt;/p&gt;&#10;&lt;p&gt;تخيّل أنك تعمل مع صديقك على بناء برمجيات تدوين. الفكرة أن يكتب الكاتب منشوراته بصيغة markdown، مع بعض البيانات الوصفية (metadata) في أعلى الملف. وعند بدء التشغيل، سيقرأ خادم الويب مجلدًا ليبني بعض &lt;code&gt;Post&lt;/code&gt;s، ثم تستخدم دالة &lt;code&gt;NewHandler&lt;/code&gt; منفصلة تلك &lt;code&gt;Post&lt;/code&gt;s كمصدر بيانات لخادم المدونة.&lt;/p&gt;</description></item><item><title>القوالب (Templating)</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/html-templates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/html-templates/</guid><description>&lt;h1 id="القوالب-templating"&gt;القوالب (Templating)&lt;a class="anchor" href="#%d8%a7%d9%84%d9%82%d9%88%d8%a7%d9%84%d8%a8-templating"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/blogrenderer"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;نعيش في عالم يريد فيه الجميع بناء تطبيقات ويب بأحدث صيحة رائجة من إطارات عمل الواجهات الأمامية، مبنية فوق غيغابايتات من JavaScript المُحوَّلة (transpiled)، وتعمل مع نظام بناء بالغ التعقيد؛ &lt;a href="https://quii.dev/The_Web_I_Want"&gt;لكن ربما لا يكون ذلك ضروريًا دائمًا&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;وأود القول إن معظم مطوري Go يقدّرون سلسلة أدوات بسيطة ومستقرة وسريعة، لكن عالم الواجهات الأمامية كثيرًا ما يخفق في تقديم ذلك.&lt;/p&gt;&#10;&lt;p&gt;كثيرة هي المواقع التي لا تحتاج إلى أن تكون &lt;a href="https://en.wikipedia.org/wiki/Single-page_application"&gt;تطبيقات صفحة واحدة (SPA)&lt;/a&gt;. &lt;strong&gt;فـ HTML و CSS طريقتان رائعتان لتقديم المحتوى&lt;/strong&gt;، ويمكنك استخدام Go لبناء موقع يقدّم HTML.&lt;/p&gt;</description></item><item><title>الـ Generics</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/generics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/generics/</guid><description>&lt;h1 id="الـ-generics"&gt;الـ Generics&lt;a class="anchor" href="#%d8%a7%d9%84%d9%80-generics"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/generics"&gt;يمكنك العثور على كل كود هذا الفصل هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;سيقدّم لك هذا الفصل مقدمة عن الـ generics، ويُزيل أي تحفظات قد تكون لديك تجاهها، ويعطيك فكرة عن كيفية تبسيط بعض كودك في المستقبل. وبعد قراءته ستعرف كيف تكتب:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;دالة تأخذ وسائط من نوع generic&lt;/li&gt;&#10;&lt;li&gt;نوع بيانات generic&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="دوال-المساعدة-في-اختباراتنا-assertequal-assertnotequal"&gt;دوال المساعدة في اختباراتنا (&lt;code&gt;AssertEqual&lt;/code&gt;, &lt;code&gt;AssertNotEqual&lt;/code&gt;)&lt;a class="anchor" href="#%d8%af%d9%88%d8%a7%d9%84-%d8%a7%d9%84%d9%85%d8%b3%d8%a7%d8%b9%d8%af%d8%a9-%d9%81%d9%8a-%d8%a7%d8%ae%d8%aa%d8%a8%d8%a7%d8%b1%d8%a7%d8%aa%d9%86%d8%a7-assertequal-assertnotequal"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;لاستكشاف الـ generics سنكتب بعض دوال المساعدة (test helpers).&lt;/p&gt;&#10;&lt;h3 id="التحقق-من-الأعداد-الصحيحة"&gt;التحقق من الأعداد الصحيحة&lt;a class="anchor" href="#%d8%a7%d9%84%d8%aa%d8%ad%d9%82%d9%82-%d9%85%d9%86-%d8%a7%d9%84%d8%a3%d8%b9%d8%af%d8%a7%d8%af-%d8%a7%d9%84%d8%b5%d8%ad%d9%8a%d8%ad%d8%a9"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;لنبدأ بشيء بسيط ثم نتقدم خطوة بخطوة نحو هدفنا&lt;/p&gt;</description></item><item><title>إعادة زيارة المصفوفات والشرائح مع الـ Generics</title><link>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/revisiting-arrays-and-slices-with-generics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/revisiting-arrays-and-slices-with-generics/</guid><description>&lt;h1 id="إعادة-زيارة-المصفوفات-والشرائح-مع-الـ-generics"&gt;إعادة زيارة المصفوفات والشرائح مع الـ Generics&lt;a class="anchor" href="#%d8%a5%d8%b9%d8%a7%d8%af%d8%a9-%d8%b2%d9%8a%d8%a7%d8%b1%d8%a9-%d8%a7%d9%84%d9%85%d8%b5%d9%81%d9%88%d9%81%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d8%b4%d8%b1%d8%a7%d8%a6%d8%ad-%d9%85%d8%b9-%d8%a7%d9%84%d9%80-generics"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/quii/learn-go-with-tests/tree/main/arrays"&gt;كود هذا الفصل تكملة لفصل المصفوفات والشرائح، وتجده هنا&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ألقِ نظرة على كل من &lt;code&gt;SumAll&lt;/code&gt; و&lt;code&gt;SumAllTails&lt;/code&gt; اللتين كتبناهما في &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/arrays-and-slices/"&gt;المصفوفات والشرائح&lt;/a&gt;. وإذا لم تكن تحتفظ بنسختك، فانسخ الكود من فصل &lt;a href="https://zeyadsleem.github.io/learn-go-with-tests-ar/docs/go-fundamentals/arrays-and-slices/"&gt;المصفوفات والشرائح&lt;/a&gt; مع الاختبارات.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Sum calculates the total from a slice of numbers.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// SumAllTails calculates the sums of all but the first number given a collection of slices.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;SumAllTails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbersToSum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;numbersToSum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&#9;&lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#9;&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sums&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هل ترى نمطًا متكررًا؟&lt;/p&gt;</description></item></channel></rss>