Menu
Coddy logo textTech

Go Cheat Sheet: דף עזר ל-Golang

עודכן לאחרונה

Hello World ומבנה התוכנית

כל תוכנית Go נמצאת בתוך package; נקודת הכניסה היא func main ב-package main.

פעולהתחביר
הצהרת packagepackage main
ייבוא packageimport "fmt"
ייבוא כמה packagesimport (\n "fmt"\n "os"\n)
נקודת כניסהfunc main() { ... }
הדפסת שורהfmt.Println("Hello, World!")
הדפסה מעוצבתfmt.Printf("%d items\n", n)
הרצת קובץgo run main.go
בניית קובץ הרצהgo build

משתנים וטיפוסים

Go היא שפה עם טיפוסים סטטיים, אבל יודעת להסיק טיפוסים עם :=.

פעולהתחביר
הצהרה עם טיפוסvar age int = 30
הצהרה עם הסקת טיפוסvar name = "Ada"
הצהרה מקוצרתcount := 0
כמה בבת אחתx, y := 1, 2
קבועconst Pi = 3.14
ערכי אפס0, "", false, nil
טיפוסים בסיסייםint, float64, string, bool, byte, rune
המרת טיפוסיםf := float64(i)

בקרת זרימה

ל-Go יש מילת מפתח אחת ללולאות, for, ואין סוגריים סביב תנאים.

פעולהתחביר
If / elseif x > 0 { ... } else { ... }
If עם משפט אתחולif v, ok := m[k]; ok { ... }
לולאת for (בסגנון C)for i := 0; i < 10; i++ { ... }
לולאה בסגנון whilefor x < 100 { ... }
לולאה אינסופיתfor { ... }
מעבר על slice עם rangefor i, v := range items { ... }
Switchswitch day { case 1: ...; default: ... }
Switch בלי ביטויswitch { case x > 0: ... }
Break / continuebreak, continue

פונקציות

פונקציות הן ערכים מדרגה ראשונה ויכולות להחזיר כמה תוצאות.

פעולהתחביר
פונקציה בסיסיתfunc add(a int, b int) int { return a + b }
טיפוס משותף לפרמטריםfunc add(a, b int) int { ... }
כמה ערכי החזרהfunc divmod(a, b int) (int, int) { return a / b, a % b }
ערכי החזרה עם שםfunc split(sum int) (x, y int) { x = sum / 2; return }
פונקציה עם מספר משתנה של ארגומנטיםfunc sum(nums ...int) int { ... }
פונקציה אנונימיתf := func() { ... }
Closurefunc counter() func() int { ... }
Defer (רץ ביציאה מהפונקציה)defer file.Close()

Slices ומערכים

למערכים יש גודל קבוע; slices הם תצוגות דינמיות על מערכים.

פעולהתחביר
מערך בגודל קבועvar a [3]int
ליטרל של slicenums := []int{1, 2, 3}
יצירת slices := make([]int, 0, 10)
הוספהs = append(s, 4)
אורך / קיבולתlen(s), cap(s)
חיתוך slices[1:3]
העתקהcopy(dst, src)
מעבר על האיבריםfor i, v := range s { ... }

Maps

Maps הן טבלאות הגיבוב המובנות של Go.

פעולהתחביר
יצירת mapm := make(map[string]int)
ליטרל של mapm := map[string]int{"a": 1, "b": 2}
הגדרת ערךm["c"] = 3
קבלת ערךv := m["a"]
בדיקת קיוםv, ok := m["x"]
מחיקת מפתחdelete(m, "a")
אורךlen(m)
מעבר על האיבריםfor k, v := range m { ... }

Structs ומתודות

Structs מקבצים שדות; מתודות מוסיפות התנהגות דרך receiver.

פעולהתחביר
הגדרת structtype Point struct { X, Y int }
יצירת מופעp := Point{X: 1, Y: 2}
גישה לשדהp.X
מצביע ל-structp := &Point{1, 2}
מתודה עם value receiverfunc (p Point) Dist() float64 { ... }
מתודה עם pointer receiverfunc (p *Point) Move(dx int) { p.X += dx }
Struct משובץtype Circle struct { Point; R int }
Struct tagsName string עם תגית json:"name" בתוך backticks

ממשקים (Interfaces)

ממשקים מתממשים באופן מרומז: כל טיפוס עם המתודות הנכונות מתאים.

פעולהתחביר
הגדרת ממשקtype Shape interface { Area() float64 }
מימוש (מרומז)func (c Circle) Area() float64 { ... }
ממשק ריק (any)var x interface{} או var x any
Type assertions, ok := x.(string)
Type switchswitch v := x.(type) { case int: ... }
ממשק Stringerfunc (p Point) String() string { ... }

Goroutines ו-channels

Goroutines הן threads קלים; channels מעבירים ערכים ביניהן.

פעולהתחביר
הפעלת goroutinego doWork()
יצירת channelch := make(chan int)
Channel עם bufferch := make(chan int, 5)
שליחה ל-channelch <- 42
קבלה מ-channelv := <-ch
סגירת channelclose(ch)
מעבר על channel עם rangefor v := range ch { ... }
Select על channelsselect { case v := <-ch: ...; default: ... }
WaitGroup (המתנה לכמה goroutines)var wg sync.WaitGroup; wg.Add(1); wg.Wait()
Mutexvar mu sync.Mutex; mu.Lock(); mu.Unlock()

טיפול בשגיאות

Go מחזירה שגיאות כערכים: אין בה exceptions.

פעולהתחביר
החזרת שגיאהfunc read() (string, error) { return "", err }
בדיקת שגיאהif err != nil { return err }
יצירת שגיאהerrors.New("not found")
שגיאה מעוצבתfmt.Errorf("bad id %d", id)
עטיפת שגיאהfmt.Errorf("load: %w", err)
פתיחת עטיפה / התאמהerrors.Is(err, os.ErrNotExist)
התאמה לפי טיפוסerrors.As(err, &target)
Panic / recoverdefer func() { recover() }()

התחביר של Go שהכי שימושי, בעמוד אחד. ה-Go cheat sheet הזה הוא דף עזר מהיר לליבת השפה: משתנים וטיפוסים, slices ו-maps, structs וממשקים, וגם ה-goroutines וה-channels שבזכותם Golang מצטיינת במקביליות.

כל מה שכאן הוא Go סטנדרטי ומתקמפל עם ה-toolchain הרשמי. העתיקו את מה שצריך, או נסו כל קטע קוד בזמן אמת בעורך האונליין של Go, בלי צורך בהתקנה. לומדים Go? קורס Go האינטראקטיבי והחינמי של Coddy מלמד slices, structs, ממשקים ו-goroutines צעד אחר צעד.

שאלות נפוצות על ה-Go cheat sheet

האם ה-Go cheat sheet הזה בחינם?
כן. ה-Go cheat sheet הזה חינמי לגמרי, בלי צורך בהרשמה. שמרו אותו במועדפים וחזרו אליו בכל פעם שצריך לבדוק פעולה על slice, דפוס של channel או מתודה של struct.
מה ההבדל בין := ל-var ב-Go?
var x = 0 מצהיר על משתנה ועובד בכל מקום, כולל ברמת ה-package. x := 0 הוא הצהרת משתנה מקוצרת: הוא גם מצהיר וגם מבצע השמה, מסיק את הטיפוס, ואפשר להשתמש בו רק בתוך פונקציה. השתמשו ב-var כשצריך טיפוס מפורש או משתנה ברמת ה-package, וב-:= להצהרות מקומיות תמציתיות.
מה הם goroutines ו-channels?
Goroutine היא thread קל שמנוהל על ידי ה-runtime של Go: מפעילים אחת על ידי כתיבת go someFunc(). Channels הם צינורות עם טיפוס שמאפשרים ל-goroutines לתקשר בבטחה: goroutine אחת שולחת עם ch <- v ואחרת מקבלת עם <-ch. יחד הם מודל המקביליות המרכזי של Go, שמתומצת באמרה "share memory by communicating" (לשתף זיכרון באמצעות תקשורת).
אפשר לתרגל Go אונליין?
כן. פתחו את עורך האונליין של Go כדי להריץ כל קטע קוד מדף העזר הזה בדפדפן, בלי להתקין את ה-toolchain של Go. כשתרצו מסגרת מסודרת, קורס Go האינטראקטיבי והחינמי של Coddy לוקח אתכם צעד אחר צעד ממשתנים ו-slices ועד goroutines ו-channels.
האם דף העזר הזה מתאים למתחילים?
כן. הוא מסודר מהנושאים הנפוצים ביותר (משתנים, בקרת זרימה, פונקציות) ועד המתקדמים (goroutines, channels, טיפול בשגיאות), כך שאפשר להשתמש בחלקים העליונים כבר מהיום הראשון ולהתקדם לשאר בהמשך.
איור של שפות התכנות ב-Coddy

ללמוד Go עם Coddy

להתחיל