סיכום - בונה רשימה מקושרת
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 24 מתוך 107.
אתגר
קלבואו נבנה רשימה מקושרת מאפס! תיצרו מבנה נתונים שבו כל צומת מצביע לצומת הבא, וכך נוצרת שרשרת של ערכים מחוברים בזיכרון.
תארגנו את הקוד בשני קבצים:
linkedlist.go: הגדירו מבנהNodeעם השדותValue(int) ו-Next(*Node). צרו מבנהLinkedListשמכיל מצביע לצומתHead. ממשו את המתודות האלה עבור*LinkedList:Append- מוסיפה צומת חדש עם הערך הנתון לסוף הרשימהPrepend- מוסיפה צומת חדש עם הערך הנתון לתחילת הרשימהPrint- עוברת על הרשימה ומדפיסה את כל הערכים מופרדים באמצעות->, ומסיימת ב-nil
main.go: קראו ערכים מהקלט, בנו רשימה מקושרת באמצעות הוספת צמתים לסוף ולתחילת הרשימה, ואז הדפיסו את מבנה הרשימה הסופי.
הקלטים הבאים יסופקו:
- שורה 1: הערך הראשון להוספה לסוף הרשימה
- שורה 2: הערך השני להוספה לסוף הרשימה
- שורה 3: הערך להוספה לתחילת הרשימה
המתודה Print שלכם צריכה להפיק את הרשימה בפורמט הזה:
[value1] -> [value2] -> [value3] -> nilלדוגמה, בהינתן 10, 20 ו-5, הפלט שלכם צריך להיות:
5 -> 10 -> 20 -> nilהמתודה Append צריכה לעבור עד סוף הרשימה (שבו Next הוא nil) לפני הוספת הצומת החדש. המתודה Prepend צריכה ליצור צומת חדש, להפנות את Next שלו לראש הרשימה הנוכחי, ואז לעדכן את הראש כך שיצביע לצומת החדש. זכרו שברשימה ריקה הראש הוא nil, ולכן טפלו במקרה הזה במתודה Append שלכם.
נסו בעצמכם
package main
import "fmt"
func main() {
// קראו את ערכי הקלט
var val1, val2, val3 int
fmt.Scanln(&val1)
fmt.Scanln(&val2)
fmt.Scanln(&val3)
// צרו רשימה מקושרת חדשה
list := &LinkedList{}
// TODO: השתמשו ב-Append כדי להוסיף את val1 ואת val2 לרשימה
// TODO: השתמשו ב-Prepend כדי להוסיף את val3 לתחילת הרשימה
// TODO: הדפיסו את המבנה הסופי של הרשימה
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP ב-Go
קבצים חיצונייםסביבת העבודה והמודולים של Goחבילות וייבואשמות מיוצאים לעומת שמות לא מיוצאיםמבוא ל-OOP ב-GoStructs כמחלקותהגדרת מתודות עבור Structsמקבלי Pointer לעומת Valueאתחול Structפונקציות Constructorחזרה – מחשבון פשוט4ממשקים
מבוא לממשקיםמימוש משתמעממשק כחוזהממשק ריק (any)אימות טיפוסמתג טיפוסיםהרכבת ממשקיםממשקי Stringer ו-Errorסיכום – מחשבון צורות7כימוס
שדות מיוצאים לעומת שדות לא מיוצאיםכימוס ברמת החבילהמתודות Getter ו-Setterהסתרת מידע ב-Goסיכום – רשומות תלמידים10Generics (Go 1.18 ומעלה)
מבוא ל־Genericsפרמטרים של טיפוסיםאילוצי טיפוסיםמבנים גנרייםפתרון עוקף למתודות גנריותסיכום – אוסף גנרי2העמקה בסוגים וב-Structs
סוגים בסיסיים ומורכביםהגדרות של סוגים מותאמים אישיתתגיות StructStructs אנונימייםStructs מקונניםערכי אפס וברירות מחדלסיכום – ספר אנשי קשר5קומפוזיציה במקום ירושה
למה ב-Go אין ירושהיסודות הטמעת Structקידום מתודותהטמעת כמה Structsהטמעה לעומת אגרגציההסתרת מתודות מוטמעותסיכום – היררכיית עובדים8טיפול בשגיאות ו-OOP
ממשק errorסוגי שגיאות מותאמים אישיתעטיפת שגיאות (fmt.Errorf)שגיאות Sentinelerrors.Is() ו-errors.As()Panic, Defer ו-Recoverסיכום – מנתח קבצים11ספרייה סטנדרטית ותכנות מונחה עצמים
io.Reader ו-io.Writersort.Interfaceהממשק fmt.Stringerencoding/json עם מבניםהממשק http.Handlerסיכום – מודלים של REST API3מצביעים וזיכרון
יסודות המצביעים ב-Goמצביעים למבניםהעברה לפי ערך לעומת לפי הפניההפונקציה new()איסוף אשפה ב-Goסיכום - בונה רשימה מקושרת6פולימורפיזם ב-Go
פולימורפיזם באמצעות ממשקיםטיפוס ברווז ב-Goכללי התאמה לממשקאוספים פולימורפייםהזרקת תלויותסיכום - מעבד תשלומים9מקביליות ו-OOP
יסודות GoroutinesChannels ותקשורתChannel עם חוצץ לעומת ללא חוצץפקודת Selectsync.Mutex ו-sync.RWMutexsync.WaitGroupתכנון Struct בטוח לשימוש במקבילסיכום - מאגר עובדים12מושגים מתקדמים בתכנות מונחה עצמים
דפוס האפשרויות הפונקציונליותדפוס Builder ב-Goשרשור מתודותכינויי טיפוסים לעומת הגדרותיסודות Reflectionסקירה כללית של יצירת קודתרגלו בעצמכם: קומפיילר Go אונליין