Menu
flag Ar iconالعربيةdown icon

Hello World في Go: شرح أول برنامج بلغة Golang

برنامج hello world في Go سطرًا بسطر: package main، وكتلة import، وfunc main، وfmt.Println، مع طريقة تشغيله وأخطاء الترجمة الأولى التي يقع فيها المبتدئون.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

هذا هو البرنامج كاملًا. اضغط Run.

لا سطر من هذه الأسطر اختياري. تشرح بقية الصفحة ما يفعله كل منها.

سطرًا بسطر

package main

يبدأ كل ملف Go بعبارة package تسمّي الحزمة التي ينتمي إليها. الاسم main خاص: يعلّم الحزمة كبرنامج تنفيذي. أي اسم آخر (package utils أو package hello) ينشئ مكتبة تستوردها شيفرة أخرى لكنها لا تعمل وحدها.

import "fmt"

تجلب import حزمة أخرى لتستخدمها. fmt حزمة التنسيق والطباعة في المكتبة القياسية. بعد الاستيراد تصل إلى أسمائها المُصدَّرة عبر اسم الحزمة: fmt.Println وfmt.Printf وfmt.Sprintf.

لاستيراد عدة حزم استخدم كتلة بين قوسين بمسار واحد في كل سطر:

import (
	"fmt"
	"strings"
)

ترفض Go ترجمة ملف يستورد حزمة لا يستخدمها. هذا يبقي قوائم الاعتماديات صادقة، وهو أول خطأ يصادفه معظم الناس.

func main()

تعرّف func دالة. والدالة main في الحزمة main هي نقطة الدخول: يبدأ البرنامج عندما تبدأ main وينتهي عندما تعود main. لا تأخذ وسائط ولا تعيد شيئًا. وسائط سطر الأوامر تأتي من os.Args، ورموز الخروج من os.Exit.

fmt.Println("Hello, World!")

تطبع Println وسائطها، وتضع مسافة بينها، وتضيف سطرًا جديدًا. يبدأ الاسم بحرف كبير لأن الأسماء التي تبدأ بحرف كبير وحدها تُصدَّر من الحزمة. fmt.println بحرف p صغير خطأ ترجمة.

طباعة ما هو أكثر من نص

تأخذ Println أي عدد من القيم من أي نوع. وتمنحك Printf تحكّمًا في التنسيق:

يُستبدل %s بنص و%d بعدد صحيح. لا تضيف Printf ولا Print سطرًا جديدًا، فتكتب \n بنفسك. جدول الأفعال الكامل في صفحة fmt.Printf.

شغّله على جهازك

بعد تثبيت Go، احفظ البرنامج باسم main.go في مجلد فارغ وشغّله:

go run main.go
Hello, World!

يترجم go run الملف إلى ملف تنفيذي مؤقّت ويشغّله. لإنتاج ملف تنفيذي تحتفظ به وتنسخه إلى مكان آخر استخدم go build:

go mod init example.com/hello
go build
./hello
Hello, World!

يحتاج go build إلى وحدة (ملف go.mod)، ينشئها go mod init. يُسمّى الملف التنفيذي باسم آخر جزء من مسار الوحدة، أي hello هنا (hello.exe في Windows). الفرق بين run وbuild وinstall مشروح في صفحة go run وgo build.

أين ذهبت الفواصل المنقوطة

تستخدم قواعد Go الفواصل المنقوطة، لكنك لا تكتبها تقريبًا أبدًا. يُدرج المترجم واحدة في نهاية أي سطر يمكن أن ينهي آخرُ رمز فيه عبارة: معرّف، أو حرفية، أو )، أو }، وبعض الكلمات المفتاحية مثل return. لهذه القاعدة يفشل هذا الأسلوب الشائع في لغات أخرى:

func main()
{
	fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {

أُدرجت فاصلة منقوطة بعد func main()، فصار { في السطر التالي خطأ. القوس الافتتاحي يوضع دائمًا في السطر نفسه. والقاعدة نفسها تنطبق على if وfor وswitch وكل كتلة أخرى.

الأخطاء الأولى، مشروحة

هذه هي الرسائل التي يراها المبتدئون في ساعتهم الأولى، كما تطبعها Go 1.24 بالضبط.

استيراد أو متغيّر غير مستخدم.

package main

import (
	"fmt"
	"os"
)

func main() {
	x := 5
	fmt.Println("hi")
}
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x

كلاهما خطأ ترجمة، لا تحذير. احذف الاستيراد أو المتغيّر. إذا احتجت إبقاء متغيّر أثناء تتبّع الأخطاء، فأسنده إلى المعرّف الفارغ: _ = x.

اسم دالة بحرف صغير.

./main.go:6:6: undefined: fmt.println

الأسماء غير المُصدَّرة غير مرئية خارج حزمتها. استخدم fmt.Println.

اسم حزمة خاطئ.

package example.com/hello is not a main package

يقول الملف package hello (أو أي شيء غير main) وحاولت تشغيله. غيّره إلى package main.

وحدة مفقودة.

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

يعمل go build وgo run . على الوحدات. شغّل go mod init example.com/hello مرة واحدة في المجلد. أما go run main.go، الذي يسمّي ملفًا، فيعمل دونها.

التنسيق

لدى Go أسلوب شيفرة رسمي واحد، ويطبّقه gofmt. شغّله على كل ملف تكتبه:

go fmt ./...

يستخدم مسافات الجدولة للإزاحة، ويحاذي التعليقات وحقول البنى، ويوحّد التباعد. المحرّرات التي تدعم Go تشغّله عند الحفظ. شيفرة Go في كل مكان تبدو متشابهة، فلا شيء لتضبطه ولا شيء تتجادل حوله في مراجعة الشيفرة.

الأسئلة الشائعة

كيف تكتب hello world في Go؟

احفظ هذا باسم main.go:

package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}

ثم شغّل go run main.go. يطبع Hello, World!.

لماذا يحتاج برنامج Go إلى package main؟

تخبر package main المترجم أن هذه الحزمة برنامج تنفيذي لا مكتبة. يبدأ البرنامج من الدالة main في الحزمة main. أي اسم حزمة آخر ينتج مكتبة، ويرفضها go run برسالة "is not a main package".

لماذا يكون القوس المعقوص الافتتاحي في السطر نفسه في Go؟

تُدرج Go فواصل منقوطة تلقائيًا في نهاية الأسطر التي يمكن أن تنتهي بها عبارة، ومنها ما بعد func main(). فيبدأ { في السطر التالي كتلة منفصلة، ويبلغ المترجم syntax error: unexpected semicolon or newline before {. يجب أن يكون القوس في السطر نفسه.

ماذا تعني fmt في Go؟

fmt حزمة المكتبة القياسية للإدخال والإخراج المنسّق (الاسم اختصار لـ "format"). تطبع fmt.Println وسائطها مع مسافات بينها وسطر جديد في النهاية؛ وتطبع fmt.Printf باستخدام نص تنسيق.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن