Menu

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 היא החבילה של הספרייה הסטנדרטית לעיצוב ולהדפסה. אחרי ה-import, מגיעים לשמות המיוצאים שלה דרך שם החבילה: 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 בעצמכם. הטבלה המלאה של ה-verbs נמצאת בעמוד על 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 מדפיסה אותן.

import או משתנה שלא בשימוש.

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

שתיהן שגיאות קומפילציה, לא אזהרות. מחקו את ה-import או את המשתנה. אם צריך לשמור משתנה בזמן דיבאג, השימו אותו למזהה הריק: _ = 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 ./...

הוא משתמש בטאבים להזחה, מיישר הערות ושדות של structs ומנרמל רווחים. עורכים עם תמיכה ב-Go מריצים אותו בכל שמירה. קוד Go נראה אותו דבר בכל מקום, כך שאין מה להגדיר ואין על מה להתווכח ב-code review.

שאלות נפוצות

איך כותבים 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

ללמוד תכנות עם Coddy

להתחיל