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