איך עובד struct tags בGO?
-
למי שמכיר קצת את GO יש תגיות שמוסיפים לstruct
כשרוצים לקבל משתנים ממקור חיצוני.
ראיתי מלמעלה כמה פוסטים שמסבירים את הנקודה
אבל לא כ"כ הבנתי את הנקודה.אולי מישהו יכול להסביר את זה בעברית?
(אם אין לכם את זה בשליפה, בבקשה אל תתאמצו
אני מקסימום ישב על זה עוד קצת עד שאני יקלוט) -
@יוסף-בן-שמעון
איך זה עובד מאחורי הקלעים?
אני משתמש בזה כרגע בלי להבין. -
@nigun ממה שאני מבין זה סתם חתיכת מטה דאטה שאתה יכול לשייך לשדה של struct.
אפשר לכתוב שם מה שבא לך.
יש גם חבילות שמשתמשות בתגים כדי לאפשר למתכנת להעביר לספרייה מידע אודות השדה. למשל חבילת encoding/json. ואז הם מצפים שהמטה דאטה יהיה בפורמט מסויים.
אין כאן הרבה קסמים מאחורי הקלעים -
@yossiz אמר באיך עובד struct tags בGO?:
בדיוק
כמעט.
הבעיה שאיתה צריך להתמודד בהמרה לJSON היא זו:
המעצבים של גו החליטו על דרך מקורית להפריד בין נכסים ציבוריים של מחלקה\חבילה לנכסים פרטיים, כל נכס ששמו מתחיל באות גדולה הוא ציבורי, ובאות קטנה הוא פרטי. (נכס ציבורי - נכס שנגיש גם מחוץ למחלקה, נכס פרטי - נגיש רק לחברי המחלקה)
נמצא שאם אבנה מבנה כזה:struct Person{ id int firstName string }
לא אוכל להמיר אותו למחרוזת בתקן JSON, כי לחבילה של ההמרה לא תהיה גישה לנכסים id firstName, והיא לא תדע על קיומם ועל הערכים שלהם.
ואם אכריז עליהם ציבוריים:struct Person{ Id int FirstName string }
ואמיר אותם למחרוזת, אקבל מחרוזת כזו
{Id:1, FirstName:"Moshe"}
וזה לא יהיה תקין, כי המוסכמה של JSON היא camel case שהאות הראשונה קטנה.
בשביל זה מוסיפים לכל שדה הערה שמחילה ב json: וכשהחבילה ממירה את המבנה למחרוזת היא מחפשת האם קיימת הערה שנוגעת אליה, אם כן - היא לוקחת ממנה את ההוראות של שם הנכס ודרכי הטיפול בנכס, אחרת היא לא מתעלמת מהנכס לגמרי, היא נותנת לו את שם ברירת המחדל שלו, דהיינו השם שמתחיל באות גדולה. -
@יוסף-בן-שמעון
יש גם את הפיצ'ר שלomitempty
שאם הערך ריק הוא לא מציג אותו בכלל, במקום להציג אותו כשהוא ריק.
https://play.golang.org/p/hOahiVs2dv0 -
@יוסף-בן-שמעון
מה השימוש בזה?
אם אתה לא רוצה אל תכניס אותו לstruct (איך אומרים struct בעברית) -
אגב נתקלתי בתוסף
שמוסיף את כל התגיות באופן אוטומטי במקום לעשות העתק הדבק אינסופי
https://github.com/fatih/gomodifytags