מדריך לשפת GO -שלום עולם

חלק ראשון -התקנה ושלום עולם

Authors
  • Name
    nigun
    Published on
    Twitter

התקנת סביבת עבודה

להתקנה בווינודס\לינוקס אפשר להוריד את הקובץ התקנה התקנה כאן
ולפעול לפי ההוראות. (לא אמור להיות מסובך, אם צריך מדריך גם לזה, אשמח לשמוע בתגובות).

(אני משתמש במדריך הזה בפקודות לינוקס, אבל כמובן שזה טוב גם לווינדוס)

אם אתם לא רוצים להתקין על המחשב, אפשר לכתוב ולהריץ את הקוד באתר הזה:
https://play.golang.org

ניצור תיקיה שתכיל את הפרוייקט שלנו

mkdir my-go-app

ונגדיר את השם של הפרוייקט שלנו (בהמשך נראה מה הצורך בזה)

go mod init myapp/main

בתוכו ניצור את הקובץ main.go
ונתחיל עם התוכנה הכי פשוטה

package main

func main() {

}

ונקמפל אותה עם הפקודה
go build main.go

עכשיו נוצר לנו בתיקיה קובץ בשם main
ואם נריץ אותו (כך ./main) התוכנה תרוץ בלי לעשות כלום.

אבל רגע! למה הקובץ שוקל 1.16 MB כשהוא לא עושה כלום?

התשובה הפשוטה היא שהקומפיילר של GO לא ממיר רק את הפקודות שלי משפה אנושית לשפת מכונה,
אלא דואג להכניס עוד מעטפת של פקודות למכונה כדי שהתוכנה תרוץ בצורה המיטבית.
למשל: למחוק מהזכרון של המחשב מידע שכבר לא נמצא בשימוש (GC), לקבל מידע רלוונטי לתוכנה שלנו מהמערכת הפעלה, ניהול קוד אסינכרוני ועוד.

(זה קצת חיסרון כשזה מגיע למכשירי IoT, כשמוגבלים בשטח האחסון של המכשיר או בwasm שרוצים לחסוך בגודל הקבצים, אבל בתוכנה קלאסית זה לא מפריע הכמה MB הנוספים)

אז בא ננסה להבין מה כתבנו כתבנו:
השורה הראשונה מסמנת באיזה חבילה הקוד שלנו (כרגע פחות רלוונטי, בכל אופן זה צריך להיות main).
השורה השניה היא הפונקציה הראשית של התוכנה שלנו (שכרגע ריקה).

אחרי הקימפול, כשהמחשב מפעיל את הקוד, הוא מתחיל מ main.main
ומשם אפשר לקרוא לכל פונקציות אחרות של התוכנה שלנו .
(כמובן לכל כלל יש יוצא מן הכלל אבל זה הרעיון).

כך שזה לא משנה אם נשים את פונקציית mainבסוף העמוד או בקובץ אחר שנמצא בחבילת main
תמיד התוכנה תתחיל לרוץ משם.
אבל למען הסדר הטוב מומלץ לשים את פונקצית mainבקובץ main.go (או בשם אחר שברור שהוא המרכזי) כדי שיהיה קל לקרוא את הקוד שלנו בעתיד.

אז בא נעשה משהו מועיל...
בשביל להדפיס משהו נצטרך את החבילה fmt (חבילה שמשמשת בעיקר להדפסת ופירמוט טקסט)
קודם נייבא את החבילה עם import "fmt"
ואז נוכל להשתמש בה בתוך הפונקציה שלנו
fmt.Println("Hello") שזה בעצם קורא לפונקציה Println שבתוך חבילת fmt

ועכשיו הקוד שלנו יראה כך:

package main

import "fmt"

func main() {
fmt.Println("Hello")
}

``

נקמפל שוב :go build main.go
ונריץ : ./main

והפלט יהיה (כמובן) Hello.

בGO יש קיצור דרך ובמקום לקמפל ולהריץ, בשני פקודות נפרדות, אפשר להריץ:
go run main.go
ובגלל שהקומפיילר מהיר, זה מרגיש כמעט כמו להריץ נוד.

שימו לב שבשונה משפות אחרות אין כאן ; בסוף השורה.
למה? כי מעצבי השפה החליטו שלא צריך את זה!
כנ"ל לגבי מעברי שורה לפני\אחרי סוגריים, מעצבי השפה החליטו על פורמט אחיד כדי למנוע כמה סגנונות קוד
ואם תנסו לקמפל קוד לא תקני הוא פשוט לא יתקמפל, אמנם בכל זאת יש ניואנסים של רווחים וכדומה שהקומפיילר לא בודק, ובשביל זה הוסיפו כלי בשם go fmt שפשוט מסדר את הקוד, והוא מוטמע בכל התוספים של העורכי קוד, כך מקווים שכל קוד שתראו בעולם יראה דומה ככל הניתן.