[{"data":1,"prerenderedAt":3155},["ShallowReactive",2],{"page-\u002Fgo\u002F23-encoding":3},{"id":4,"title":5,"body":6,"description":3148,"extension":3149,"meta":3150,"navigation":167,"path":3151,"seo":3152,"stem":3153,"__hash__":3154},"content\u002Fgo\u002F23-encoding.md","23 — Encoding: JSON, CSV, gob",{"type":7,"value":8,"toc":3141},"minimark",[9,13,22,3137],[10,11,5],"h1",{"id":12},"_23-encoding-json-csv-gob",[14,15,17,18],"h2",{"id":16},"json-struct-tags-and-omitempty","JSON — Struct Tags and ",[19,20,21],"code",{},"omitempty",[23,24,26,401,412,3028,3117,3121],"code-wrapper",{"language":25},"go",[27,28,32],"pre",{"className":29,"code":30,"language":25,"meta":31,"style":31},"language-go shiki shiki-themes github-light github-dark","type User struct {\n    \u002F\u002F JSON tags control serialization:\n    ID       int64  `json:\"id\"`                          \u002F\u002F serialize as \"id\"\n    Name     string `json:\"name\" validate:\"required\"`   \u002F\u002F multiple tags\n    Email    string `json:\"email,omitempty\"`             \u002F\u002F omit if zero value\n    Password string `json:\"-\"`                           \u002F\u002F never serialize\n    Age      *int   `json:\"age,omitempty\"`              \u002F\u002F *int: nil=omit, 0=include\n    CreatedAt time.Time `json:\"created_at\"`              \u002F\u002F snake_case in JSON\n}\n\n\u002F\u002F ─── omitempty traps ───\ntype Response struct {\n    Count int    `json:\"count,omitempty\"`   \u002F\u002F 0 → omitted (but 0 may be valid!)\n    Items []int  `json:\"items,omitempty\"`    \u002F\u002F nil\u002Fempty → omitted\n    Name  string `json:\"name,omitempty\"`     \u002F\u002F \"\" → omitted\n    Done  bool   `json:\"done,omitempty\"`     \u002F\u002F false → omitted\n}\n\nr := Response{Count: 0, Items: []int{}}\ndata, _ := json.Marshal(r)\n\u002F\u002F {\"items\":[]}  — Count and Name omitted (zero values), Items included (non-nil empty)\n\u002F\u002F ⚠️ Count=0 was omitted — but 0 might be a valid count!\n\n\u002F\u002F ✅ Fix: use *int for fields where 0 is a valid value:\ntype FixedResponse struct {\n    Count *int `json:\"count,omitempty\"`  \u002F\u002F nil → omitted, 0 → \"count\":0\n}\nc := 0\nfr := FixedResponse{Count: &c}\ndata, _ = json.Marshal(fr)\n\u002F\u002F {\"count\":0}  — 0 is included because *int is non-nil\n","",[19,33,34,54,61,77,92,106,120,135,156,162,169,175,187,202,216,230,245,250,255,281,298,304,310,315,321,333,346,351,362,380,395],{"__ignoreMap":31},[35,36,39,43,47,50],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"svdQ7","type",[35,44,46],{"class":45},"sIsaT"," User",[35,48,49],{"class":41}," struct",[35,51,53],{"class":52},"ssxIu"," {\n",[35,55,57],{"class":37,"line":56},2,[35,58,60],{"class":59},"sdCPZ","    \u002F\u002F JSON tags control serialization:\n",[35,62,64,67,70,74],{"class":37,"line":63},3,[35,65,66],{"class":52},"    ID       ",[35,68,69],{"class":41},"int64",[35,71,73],{"class":72},"sJ6F3","  `json:\"id\"`",[35,75,76],{"class":59},"                          \u002F\u002F serialize as \"id\"\n",[35,78,80,83,86,89],{"class":37,"line":79},4,[35,81,82],{"class":52},"    Name     ",[35,84,85],{"class":41},"string",[35,87,88],{"class":72}," `json:\"name\" validate:\"required\"`",[35,90,91],{"class":59},"   \u002F\u002F multiple tags\n",[35,93,95,98,100,103],{"class":37,"line":94},5,[35,96,97],{"class":52},"    Email    ",[35,99,85],{"class":41},[35,101,102],{"class":72}," `json:\"email,omitempty\"`",[35,104,105],{"class":59},"             \u002F\u002F omit if zero value\n",[35,107,109,112,114,117],{"class":37,"line":108},6,[35,110,111],{"class":52},"    Password ",[35,113,85],{"class":41},[35,115,116],{"class":72}," `json:\"-\"`",[35,118,119],{"class":59},"                           \u002F\u002F never serialize\n",[35,121,123,126,129,132],{"class":37,"line":122},7,[35,124,125],{"class":52},"    Age      ",[35,127,128],{"class":41},"*int",[35,130,131],{"class":72},"   `json:\"age,omitempty\"`",[35,133,134],{"class":59},"              \u002F\u002F *int: nil=omit, 0=include\n",[35,136,138,141,144,147,150,153],{"class":37,"line":137},8,[35,139,140],{"class":52},"    CreatedAt ",[35,142,143],{"class":45},"time",[35,145,146],{"class":52},".",[35,148,149],{"class":45},"Time",[35,151,152],{"class":72}," `json:\"created_at\"`",[35,154,155],{"class":59},"              \u002F\u002F snake_case in JSON\n",[35,157,159],{"class":37,"line":158},9,[35,160,161],{"class":52},"}\n",[35,163,165],{"class":37,"line":164},10,[35,166,168],{"emptyLinePlaceholder":167},true,"\n",[35,170,172],{"class":37,"line":171},11,[35,173,174],{"class":59},"\u002F\u002F ─── omitempty traps ───\n",[35,176,178,180,183,185],{"class":37,"line":177},12,[35,179,42],{"class":41},[35,181,182],{"class":45}," Response",[35,184,49],{"class":41},[35,186,53],{"class":52},[35,188,190,193,196,199],{"class":37,"line":189},13,[35,191,192],{"class":52},"    Count ",[35,194,195],{"class":41},"int",[35,197,198],{"class":72},"    `json:\"count,omitempty\"`",[35,200,201],{"class":59},"   \u002F\u002F 0 → omitted (but 0 may be valid!)\n",[35,203,205,208,210,213],{"class":37,"line":204},14,[35,206,207],{"class":52},"    Items []",[35,209,195],{"class":41},[35,211,212],{"class":72},"  `json:\"items,omitempty\"`",[35,214,215],{"class":59},"    \u002F\u002F nil\u002Fempty → omitted\n",[35,217,219,222,224,227],{"class":37,"line":218},15,[35,220,221],{"class":52},"    Name  ",[35,223,85],{"class":41},[35,225,226],{"class":72}," `json:\"name,omitempty\"`",[35,228,229],{"class":59},"     \u002F\u002F \"\" → omitted\n",[35,231,233,236,239,242],{"class":37,"line":232},16,[35,234,235],{"class":52},"    Done  ",[35,237,238],{"class":41},"bool",[35,240,241],{"class":72},"   `json:\"done,omitempty\"`",[35,243,244],{"class":59},"     \u002F\u002F false → omitted\n",[35,246,248],{"class":37,"line":247},17,[35,249,161],{"class":52},[35,251,253],{"class":37,"line":252},18,[35,254,168],{"emptyLinePlaceholder":167},[35,256,258,261,264,266,269,273,276,278],{"class":37,"line":257},19,[35,259,260],{"class":52},"r ",[35,262,263],{"class":41},":=",[35,265,182],{"class":45},[35,267,268],{"class":52},"{Count: ",[35,270,272],{"class":271},"snvgF","0",[35,274,275],{"class":52},", Items: []",[35,277,195],{"class":41},[35,279,280],{"class":52},"{}}\n",[35,282,284,287,289,292,295],{"class":37,"line":283},20,[35,285,286],{"class":52},"data, _ ",[35,288,263],{"class":41},[35,290,291],{"class":52}," json.",[35,293,294],{"class":45},"Marshal",[35,296,297],{"class":52},"(r)\n",[35,299,301],{"class":37,"line":300},21,[35,302,303],{"class":59},"\u002F\u002F {\"items\":[]}  — Count and Name omitted (zero values), Items included (non-nil empty)\n",[35,305,307],{"class":37,"line":306},22,[35,308,309],{"class":59},"\u002F\u002F ⚠️ Count=0 was omitted — but 0 might be a valid count!\n",[35,311,313],{"class":37,"line":312},23,[35,314,168],{"emptyLinePlaceholder":167},[35,316,318],{"class":37,"line":317},24,[35,319,320],{"class":59},"\u002F\u002F ✅ Fix: use *int for fields where 0 is a valid value:\n",[35,322,324,326,329,331],{"class":37,"line":323},25,[35,325,42],{"class":41},[35,327,328],{"class":45}," FixedResponse",[35,330,49],{"class":41},[35,332,53],{"class":52},[35,334,336,338,340,343],{"class":37,"line":335},26,[35,337,192],{"class":52},[35,339,128],{"class":41},[35,341,342],{"class":72}," `json:\"count,omitempty\"`",[35,344,345],{"class":59},"  \u002F\u002F nil → omitted, 0 → \"count\":0\n",[35,347,349],{"class":37,"line":348},27,[35,350,161],{"class":52},[35,352,354,357,359],{"class":37,"line":353},28,[35,355,356],{"class":52},"c ",[35,358,263],{"class":41},[35,360,361],{"class":271}," 0\n",[35,363,365,368,370,372,374,377],{"class":37,"line":364},29,[35,366,367],{"class":52},"fr ",[35,369,263],{"class":41},[35,371,328],{"class":45},[35,373,268],{"class":52},[35,375,376],{"class":41},"&",[35,378,379],{"class":52},"c}\n",[35,381,383,385,388,390,392],{"class":37,"line":382},30,[35,384,286],{"class":52},[35,386,387],{"class":41},"=",[35,389,291],{"class":52},[35,391,294],{"class":45},[35,393,394],{"class":52},"(fr)\n",[35,396,398],{"class":37,"line":397},31,[35,399,400],{"class":59},"\u002F\u002F {\"count\":0}  — 0 is included because *int is non-nil\n",[14,402,404,405,408,409],{"id":403},"json-streaming-with-jsonencoderdecoder","JSON — Streaming with ",[19,406,407],{},"json.Encoder","\u002F",[19,410,411],{},"Decoder",[23,413,414,871,879],{"language":25},[27,415,417],{"className":29,"code":416,"language":25,"meta":31,"style":31},"\u002F\u002F ─── Encoder — streaming write (NDJSON, log files) ───\nfunc writeNDJSON(path string, records []User) error {\n    f, err := os.Create(path)\n    if err != nil { return err }\n    defer f.Close()\n\n    enc := json.NewEncoder(f)\n    enc.SetIndent(\"\", \"  \")  \u002F\u002F pretty-print (optional, don't use for NDJSON)\n    for _, r := range records {\n        if err := enc.Encode(r); err != nil {  \u002F\u002F one JSON object per line\n            return err\n        }\n    }\n    return nil\n}\n\n\u002F\u002F ─── Decoder — streaming read (HTTP bodies, large files) ───\nfunc decodeStream(r io.Reader) error {\n    dec := json.NewDecoder(r)\n    for {\n        var u User\n        if err := dec.Decode(&u); err != nil {\n            if err == io.EOF { break }\n            return err\n        }\n        process(u)  \u002F\u002F one record at a time — no full buffering\n    }\n    return nil\n}\n\n\u002F\u002F ─── DisallowUnknownFields — strict schema ───\nfunc strictDecode(r io.Reader, v any) error {\n    dec := json.NewDecoder(r)\n    dec.DisallowUnknownFields()  \u002F\u002F error on unrecognized fields\n    return dec.Decode(v)\n}\n\u002F\u002F Useful for API clients where the server shouldn't add fields silently.\n",[19,418,419,424,462,478,501,515,519,534,558,574,602,610,615,620,628,632,636,641,667,681,687,698,725,744,750,754,765,769,775,779,783,788,820,833,848,860,865],{"__ignoreMap":31},[35,420,421],{"class":37,"line":38},[35,422,423],{"class":59},"\u002F\u002F ─── Encoder — streaming write (NDJSON, log files) ───\n",[35,425,426,429,432,435,439,442,445,448,451,454,457,460],{"class":37,"line":56},[35,427,428],{"class":41},"func",[35,430,431],{"class":45}," writeNDJSON",[35,433,434],{"class":52},"(",[35,436,438],{"class":437},"sCrzJ","path",[35,440,441],{"class":41}," string",[35,443,444],{"class":52},", ",[35,446,447],{"class":437},"records",[35,449,450],{"class":52}," []",[35,452,453],{"class":45},"User",[35,455,456],{"class":52},") ",[35,458,459],{"class":41},"error",[35,461,53],{"class":52},[35,463,464,467,469,472,475],{"class":37,"line":63},[35,465,466],{"class":52},"    f, err ",[35,468,263],{"class":41},[35,470,471],{"class":52}," os.",[35,473,474],{"class":45},"Create",[35,476,477],{"class":52},"(path)\n",[35,479,480,483,486,489,492,495,498],{"class":37,"line":79},[35,481,482],{"class":41},"    if",[35,484,485],{"class":52}," err ",[35,487,488],{"class":41},"!=",[35,490,491],{"class":271}," nil",[35,493,494],{"class":52}," { ",[35,496,497],{"class":41},"return",[35,499,500],{"class":52}," err }\n",[35,502,503,506,509,512],{"class":37,"line":94},[35,504,505],{"class":41},"    defer",[35,507,508],{"class":52}," f.",[35,510,511],{"class":45},"Close",[35,513,514],{"class":52},"()\n",[35,516,517],{"class":37,"line":108},[35,518,168],{"emptyLinePlaceholder":167},[35,520,521,524,526,528,531],{"class":37,"line":122},[35,522,523],{"class":52},"    enc ",[35,525,263],{"class":41},[35,527,291],{"class":52},[35,529,530],{"class":45},"NewEncoder",[35,532,533],{"class":52},"(f)\n",[35,535,536,539,542,544,547,549,552,555],{"class":37,"line":137},[35,537,538],{"class":52},"    enc.",[35,540,541],{"class":45},"SetIndent",[35,543,434],{"class":52},[35,545,546],{"class":72},"\"\"",[35,548,444],{"class":52},[35,550,551],{"class":72},"\"  \"",[35,553,554],{"class":52},")  ",[35,556,557],{"class":59},"\u002F\u002F pretty-print (optional, don't use for NDJSON)\n",[35,559,560,563,566,568,571],{"class":37,"line":158},[35,561,562],{"class":41},"    for",[35,564,565],{"class":52}," _, r ",[35,567,263],{"class":41},[35,569,570],{"class":41}," range",[35,572,573],{"class":52}," records {\n",[35,575,576,579,581,583,586,589,592,594,596,599],{"class":37,"line":164},[35,577,578],{"class":41},"        if",[35,580,485],{"class":52},[35,582,263],{"class":41},[35,584,585],{"class":52}," enc.",[35,587,588],{"class":45},"Encode",[35,590,591],{"class":52},"(r); err ",[35,593,488],{"class":41},[35,595,491],{"class":271},[35,597,598],{"class":52}," {  ",[35,600,601],{"class":59},"\u002F\u002F one JSON object per line\n",[35,603,604,607],{"class":37,"line":171},[35,605,606],{"class":41},"            return",[35,608,609],{"class":52}," err\n",[35,611,612],{"class":37,"line":177},[35,613,614],{"class":52},"        }\n",[35,616,617],{"class":37,"line":189},[35,618,619],{"class":52},"    }\n",[35,621,622,625],{"class":37,"line":204},[35,623,624],{"class":41},"    return",[35,626,627],{"class":271}," nil\n",[35,629,630],{"class":37,"line":218},[35,631,161],{"class":52},[35,633,634],{"class":37,"line":232},[35,635,168],{"emptyLinePlaceholder":167},[35,637,638],{"class":37,"line":247},[35,639,640],{"class":59},"\u002F\u002F ─── Decoder — streaming read (HTTP bodies, large files) ───\n",[35,642,643,645,648,650,653,656,658,661,663,665],{"class":37,"line":252},[35,644,428],{"class":41},[35,646,647],{"class":45}," decodeStream",[35,649,434],{"class":52},[35,651,652],{"class":437},"r",[35,654,655],{"class":45}," io",[35,657,146],{"class":52},[35,659,660],{"class":45},"Reader",[35,662,456],{"class":52},[35,664,459],{"class":41},[35,666,53],{"class":52},[35,668,669,672,674,676,679],{"class":37,"line":257},[35,670,671],{"class":52},"    dec ",[35,673,263],{"class":41},[35,675,291],{"class":52},[35,677,678],{"class":45},"NewDecoder",[35,680,297],{"class":52},[35,682,683,685],{"class":37,"line":283},[35,684,562],{"class":41},[35,686,53],{"class":52},[35,688,689,692,695],{"class":37,"line":300},[35,690,691],{"class":41},"        var",[35,693,694],{"class":52}," u ",[35,696,697],{"class":45},"User\n",[35,699,700,702,704,706,709,712,714,716,719,721,723],{"class":37,"line":306},[35,701,578],{"class":41},[35,703,485],{"class":52},[35,705,263],{"class":41},[35,707,708],{"class":52}," dec.",[35,710,711],{"class":45},"Decode",[35,713,434],{"class":52},[35,715,376],{"class":41},[35,717,718],{"class":52},"u); err ",[35,720,488],{"class":41},[35,722,491],{"class":271},[35,724,53],{"class":52},[35,726,727,730,732,735,738,741],{"class":37,"line":312},[35,728,729],{"class":41},"            if",[35,731,485],{"class":52},[35,733,734],{"class":41},"==",[35,736,737],{"class":52}," io.EOF { ",[35,739,740],{"class":41},"break",[35,742,743],{"class":52}," }\n",[35,745,746,748],{"class":37,"line":317},[35,747,606],{"class":41},[35,749,609],{"class":52},[35,751,752],{"class":37,"line":323},[35,753,614],{"class":52},[35,755,756,759,762],{"class":37,"line":335},[35,757,758],{"class":45},"        process",[35,760,761],{"class":52},"(u)  ",[35,763,764],{"class":59},"\u002F\u002F one record at a time — no full buffering\n",[35,766,767],{"class":37,"line":348},[35,768,619],{"class":52},[35,770,771,773],{"class":37,"line":353},[35,772,624],{"class":41},[35,774,627],{"class":271},[35,776,777],{"class":37,"line":364},[35,778,161],{"class":52},[35,780,781],{"class":37,"line":382},[35,782,168],{"emptyLinePlaceholder":167},[35,784,785],{"class":37,"line":397},[35,786,787],{"class":59},"\u002F\u002F ─── DisallowUnknownFields — strict schema ───\n",[35,789,791,793,796,798,800,802,804,806,808,811,814,816,818],{"class":37,"line":790},32,[35,792,428],{"class":41},[35,794,795],{"class":45}," strictDecode",[35,797,434],{"class":52},[35,799,652],{"class":437},[35,801,655],{"class":45},[35,803,146],{"class":52},[35,805,660],{"class":45},[35,807,444],{"class":52},[35,809,810],{"class":437},"v",[35,812,813],{"class":45}," any",[35,815,456],{"class":52},[35,817,459],{"class":41},[35,819,53],{"class":52},[35,821,823,825,827,829,831],{"class":37,"line":822},33,[35,824,671],{"class":52},[35,826,263],{"class":41},[35,828,291],{"class":52},[35,830,678],{"class":45},[35,832,297],{"class":52},[35,834,836,839,842,845],{"class":37,"line":835},34,[35,837,838],{"class":52},"    dec.",[35,840,841],{"class":45},"DisallowUnknownFields",[35,843,844],{"class":52},"()  ",[35,846,847],{"class":59},"\u002F\u002F error on unrecognized fields\n",[35,849,851,853,855,857],{"class":37,"line":850},35,[35,852,624],{"class":41},[35,854,708],{"class":52},[35,856,711],{"class":45},[35,858,859],{"class":52},"(v)\n",[35,861,863],{"class":37,"line":862},36,[35,864,161],{"class":52},[35,866,868],{"class":37,"line":867},37,[35,869,870],{"class":59},"\u002F\u002F Useful for API clients where the server shouldn't add fields silently.\n",[14,872,874,875,878],{"id":873},"json-the-float64-number-trap","JSON — The ",[19,876,877],{},"float64"," Number Trap",[23,880,881,1256,1266],{"language":25},[27,882,884],{"className":29,"code":883,"language":25,"meta":31,"style":31},"\u002F\u002F encoding\u002Fjson decodes numbers as float64 by default.\n\u002F\u002F This loses precision for large integers (> 2^53).\n\nfunc jsonNumberTrap() {\n    var v any\n    json.Unmarshal([]byte(`{\"id\": 12345678901234567890}`), &v)\n    m := v.(map[string]any)\n    id := m[\"id\"].(float64)\n    fmt.Println(int64(id))  \u002F\u002F 12345678901234567000 — WRONG (precision lost!)\n}\n\n\u002F\u002F ✅ Fix 1: UseNumber — numbers become json.Number (string-backed)\nfunc jsonUseNumber() {\n    dec := json.NewDecoder(strings.NewReader(`{\"id\": 12345678901234567890}`))\n    dec.UseNumber()\n    var v any\n    dec.Decode(&v)\n    m := v.(map[string]any)\n    n := m[\"id\"].(json.Number)  \u002F\u002F json.Number is a string\n    id, _ := n.Int64()  \u002F\u002F 12345678901234567890 — exact\n    fmt.Println(id)\n}\n\n\u002F\u002F ✅ Fix 2: Unmarshal into a typed struct (best for known schemas)\ntype Data struct {\n    ID int64 `json:\"id\"`  \u002F\u002F unmarshal directly into int64 — exact\n}\nfunc jsonStruct() {\n    var d Data\n    json.Unmarshal([]byte(`{\"id\": 12345678901234567890}`), &d)\n    fmt.Println(d.ID)  \u002F\u002F 12345678901234567890 — exact\n}\n",[19,885,886,891,896,900,910,921,948,975,995,1013,1017,1021,1026,1035,1058,1067,1075,1087,1107,1133,1151,1160,1164,1168,1173,1184,1197,1201,1210,1220,1241,1252],{"__ignoreMap":31},[35,887,888],{"class":37,"line":38},[35,889,890],{"class":59},"\u002F\u002F encoding\u002Fjson decodes numbers as float64 by default.\n",[35,892,893],{"class":37,"line":56},[35,894,895],{"class":59},"\u002F\u002F This loses precision for large integers (> 2^53).\n",[35,897,898],{"class":37,"line":63},[35,899,168],{"emptyLinePlaceholder":167},[35,901,902,904,907],{"class":37,"line":79},[35,903,428],{"class":41},[35,905,906],{"class":45}," jsonNumberTrap",[35,908,909],{"class":52},"() {\n",[35,911,912,915,918],{"class":37,"line":94},[35,913,914],{"class":41},"    var",[35,916,917],{"class":52}," v ",[35,919,920],{"class":45},"any\n",[35,922,923,926,929,932,935,937,940,943,945],{"class":37,"line":108},[35,924,925],{"class":52},"    json.",[35,927,928],{"class":45},"Unmarshal",[35,930,931],{"class":52},"([]",[35,933,934],{"class":41},"byte",[35,936,434],{"class":52},[35,938,939],{"class":72},"`{\"id\": 12345678901234567890}`",[35,941,942],{"class":52},"), ",[35,944,376],{"class":41},[35,946,947],{"class":52},"v)\n",[35,949,950,953,955,958,961,964,966,969,972],{"class":37,"line":122},[35,951,952],{"class":52},"    m ",[35,954,263],{"class":41},[35,956,957],{"class":52}," v.(",[35,959,960],{"class":41},"map",[35,962,963],{"class":52},"[",[35,965,85],{"class":41},[35,967,968],{"class":52},"]",[35,970,971],{"class":45},"any",[35,973,974],{"class":52},")\n",[35,976,977,980,982,985,988,991,993],{"class":37,"line":137},[35,978,979],{"class":52},"    id ",[35,981,263],{"class":41},[35,983,984],{"class":52}," m[",[35,986,987],{"class":72},"\"id\"",[35,989,990],{"class":52},"].(",[35,992,877],{"class":41},[35,994,974],{"class":52},[35,996,997,1000,1003,1005,1007,1010],{"class":37,"line":158},[35,998,999],{"class":52},"    fmt.",[35,1001,1002],{"class":45},"Println",[35,1004,434],{"class":52},[35,1006,69],{"class":41},[35,1008,1009],{"class":52},"(id))  ",[35,1011,1012],{"class":59},"\u002F\u002F 12345678901234567000 — WRONG (precision lost!)\n",[35,1014,1015],{"class":37,"line":164},[35,1016,161],{"class":52},[35,1018,1019],{"class":37,"line":171},[35,1020,168],{"emptyLinePlaceholder":167},[35,1022,1023],{"class":37,"line":177},[35,1024,1025],{"class":59},"\u002F\u002F ✅ Fix 1: UseNumber — numbers become json.Number (string-backed)\n",[35,1027,1028,1030,1033],{"class":37,"line":189},[35,1029,428],{"class":41},[35,1031,1032],{"class":45}," jsonUseNumber",[35,1034,909],{"class":52},[35,1036,1037,1039,1041,1043,1045,1048,1051,1053,1055],{"class":37,"line":204},[35,1038,671],{"class":52},[35,1040,263],{"class":41},[35,1042,291],{"class":52},[35,1044,678],{"class":45},[35,1046,1047],{"class":52},"(strings.",[35,1049,1050],{"class":45},"NewReader",[35,1052,434],{"class":52},[35,1054,939],{"class":72},[35,1056,1057],{"class":52},"))\n",[35,1059,1060,1062,1065],{"class":37,"line":218},[35,1061,838],{"class":52},[35,1063,1064],{"class":45},"UseNumber",[35,1066,514],{"class":52},[35,1068,1069,1071,1073],{"class":37,"line":232},[35,1070,914],{"class":41},[35,1072,917],{"class":52},[35,1074,920],{"class":45},[35,1076,1077,1079,1081,1083,1085],{"class":37,"line":247},[35,1078,838],{"class":52},[35,1080,711],{"class":45},[35,1082,434],{"class":52},[35,1084,376],{"class":41},[35,1086,947],{"class":52},[35,1088,1089,1091,1093,1095,1097,1099,1101,1103,1105],{"class":37,"line":252},[35,1090,952],{"class":52},[35,1092,263],{"class":41},[35,1094,957],{"class":52},[35,1096,960],{"class":41},[35,1098,963],{"class":52},[35,1100,85],{"class":41},[35,1102,968],{"class":52},[35,1104,971],{"class":45},[35,1106,974],{"class":52},[35,1108,1109,1112,1114,1116,1118,1120,1123,1125,1128,1130],{"class":37,"line":257},[35,1110,1111],{"class":52},"    n ",[35,1113,263],{"class":41},[35,1115,984],{"class":52},[35,1117,987],{"class":72},[35,1119,990],{"class":52},[35,1121,1122],{"class":45},"json",[35,1124,146],{"class":52},[35,1126,1127],{"class":45},"Number",[35,1129,554],{"class":52},[35,1131,1132],{"class":59},"\u002F\u002F json.Number is a string\n",[35,1134,1135,1138,1140,1143,1146,1148],{"class":37,"line":283},[35,1136,1137],{"class":52},"    id, _ ",[35,1139,263],{"class":41},[35,1141,1142],{"class":52}," n.",[35,1144,1145],{"class":45},"Int64",[35,1147,844],{"class":52},[35,1149,1150],{"class":59},"\u002F\u002F 12345678901234567890 — exact\n",[35,1152,1153,1155,1157],{"class":37,"line":300},[35,1154,999],{"class":52},[35,1156,1002],{"class":45},[35,1158,1159],{"class":52},"(id)\n",[35,1161,1162],{"class":37,"line":306},[35,1163,161],{"class":52},[35,1165,1166],{"class":37,"line":312},[35,1167,168],{"emptyLinePlaceholder":167},[35,1169,1170],{"class":37,"line":317},[35,1171,1172],{"class":59},"\u002F\u002F ✅ Fix 2: Unmarshal into a typed struct (best for known schemas)\n",[35,1174,1175,1177,1180,1182],{"class":37,"line":323},[35,1176,42],{"class":41},[35,1178,1179],{"class":45}," Data",[35,1181,49],{"class":41},[35,1183,53],{"class":52},[35,1185,1186,1189,1191,1194],{"class":37,"line":335},[35,1187,1188],{"class":52},"    ID ",[35,1190,69],{"class":41},[35,1192,1193],{"class":72}," `json:\"id\"`",[35,1195,1196],{"class":59},"  \u002F\u002F unmarshal directly into int64 — exact\n",[35,1198,1199],{"class":37,"line":348},[35,1200,161],{"class":52},[35,1202,1203,1205,1208],{"class":37,"line":353},[35,1204,428],{"class":41},[35,1206,1207],{"class":45}," jsonStruct",[35,1209,909],{"class":52},[35,1211,1212,1214,1217],{"class":37,"line":364},[35,1213,914],{"class":41},[35,1215,1216],{"class":52}," d ",[35,1218,1219],{"class":45},"Data\n",[35,1221,1222,1224,1226,1228,1230,1232,1234,1236,1238],{"class":37,"line":382},[35,1223,925],{"class":52},[35,1225,928],{"class":45},[35,1227,931],{"class":52},[35,1229,934],{"class":41},[35,1231,434],{"class":52},[35,1233,939],{"class":72},[35,1235,942],{"class":52},[35,1237,376],{"class":41},[35,1239,1240],{"class":52},"d)\n",[35,1242,1243,1245,1247,1250],{"class":37,"line":397},[35,1244,999],{"class":52},[35,1246,1002],{"class":45},[35,1248,1249],{"class":52},"(d.ID)  ",[35,1251,1150],{"class":59},[35,1253,1254],{"class":37,"line":790},[35,1255,161],{"class":52},[14,1257,1259,1260,408,1263],{"id":1258},"custom-marshalers-marshaljsonunmarshaljson","Custom Marshalers — ",[19,1261,1262],{},"MarshalJSON",[19,1264,1265],{},"UnmarshalJSON",[23,1267,1268,1718,1722],{"language":25},[27,1269,1271],{"className":29,"code":1270,"language":25,"meta":31,"style":31},"\u002F\u002F Implement json.Marshaler\u002FUnmarshaler for custom serialization.\n\ntype Money struct {\n    cents int64  \u002F\u002F unexported — serialize as a string\n}\n\nfunc (m Money) MarshalJSON() ([]byte, error) {\n    \u002F\u002F Serialize as \"$12.34\" string (not a number — avoids float precision issues):\n    s := fmt.Sprintf(`\"$%d.%02d\"`, m.cents\u002F100, m.cents%100)\n    return []byte(s), nil\n}\n\nfunc (m *Money) UnmarshalJSON(data []byte) error {\n    var s string\n    if err := json.Unmarshal(data, &s); err != nil {\n        return err\n    }\n    \u002F\u002F Parse \"$12.34\" → 1234 cents\n    parts := strings.Split(strings.TrimPrefix(s, \"$\"), \".\")\n    if len(parts) != 2 { return errors.New(\"invalid money format\") }\n    dollars, _ := strconv.ParseInt(parts[0], 10, 64)\n    cents, _ := strconv.ParseInt(parts[1], 10, 64)\n    m.cents = dollars*100 + cents\n    return nil\n}\n\ntype Product struct {\n    Price Money `json:\"price\"`\n}\np := Product{Price: Money{cents: 1234}}\ndata, _ := json.Marshal(p)\n\u002F\u002F {\"price\":\"$12.34\"}\n",[19,1272,1273,1278,1282,1293,1303,1307,1311,1340,1345,1391,1405,1409,1413,1445,1455,1481,1488,1492,1497,1528,1561,1592,1618,1638,1644,1648,1652,1663,1673,1677,1700,1713],{"__ignoreMap":31},[35,1274,1275],{"class":37,"line":38},[35,1276,1277],{"class":59},"\u002F\u002F Implement json.Marshaler\u002FUnmarshaler for custom serialization.\n",[35,1279,1280],{"class":37,"line":56},[35,1281,168],{"emptyLinePlaceholder":167},[35,1283,1284,1286,1289,1291],{"class":37,"line":63},[35,1285,42],{"class":41},[35,1287,1288],{"class":45}," Money",[35,1290,49],{"class":41},[35,1292,53],{"class":52},[35,1294,1295,1298,1300],{"class":37,"line":79},[35,1296,1297],{"class":52},"    cents ",[35,1299,69],{"class":41},[35,1301,1302],{"class":59},"  \u002F\u002F unexported — serialize as a string\n",[35,1304,1305],{"class":37,"line":94},[35,1306,161],{"class":52},[35,1308,1309],{"class":37,"line":108},[35,1310,168],{"emptyLinePlaceholder":167},[35,1312,1313,1315,1318,1321,1324,1326,1328,1331,1333,1335,1337],{"class":37,"line":122},[35,1314,428],{"class":41},[35,1316,1317],{"class":52}," (",[35,1319,1320],{"class":437},"m ",[35,1322,1323],{"class":45},"Money",[35,1325,456],{"class":52},[35,1327,1262],{"class":45},[35,1329,1330],{"class":52},"() ([]",[35,1332,934],{"class":41},[35,1334,444],{"class":52},[35,1336,459],{"class":41},[35,1338,1339],{"class":52},") {\n",[35,1341,1342],{"class":37,"line":137},[35,1343,1344],{"class":59},"    \u002F\u002F Serialize as \"$12.34\" string (not a number — avoids float precision issues):\n",[35,1346,1347,1350,1352,1355,1358,1360,1363,1366,1368,1371,1374,1377,1379,1382,1384,1387,1389],{"class":37,"line":158},[35,1348,1349],{"class":52},"    s ",[35,1351,263],{"class":41},[35,1353,1354],{"class":52}," fmt.",[35,1356,1357],{"class":45},"Sprintf",[35,1359,434],{"class":52},[35,1361,1362],{"class":72},"`\"$",[35,1364,1365],{"class":271},"%d",[35,1367,146],{"class":72},[35,1369,1370],{"class":271},"%02d",[35,1372,1373],{"class":72},"\"`",[35,1375,1376],{"class":52},", m.cents",[35,1378,408],{"class":41},[35,1380,1381],{"class":271},"100",[35,1383,1376],{"class":52},[35,1385,1386],{"class":41},"%",[35,1388,1381],{"class":271},[35,1390,974],{"class":52},[35,1392,1393,1395,1397,1399,1402],{"class":37,"line":164},[35,1394,624],{"class":41},[35,1396,450],{"class":52},[35,1398,934],{"class":41},[35,1400,1401],{"class":52},"(s), ",[35,1403,1404],{"class":271},"nil\n",[35,1406,1407],{"class":37,"line":171},[35,1408,161],{"class":52},[35,1410,1411],{"class":37,"line":177},[35,1412,168],{"emptyLinePlaceholder":167},[35,1414,1415,1417,1419,1421,1424,1426,1428,1430,1432,1435,1437,1439,1441,1443],{"class":37,"line":189},[35,1416,428],{"class":41},[35,1418,1317],{"class":52},[35,1420,1320],{"class":437},[35,1422,1423],{"class":41},"*",[35,1425,1323],{"class":45},[35,1427,456],{"class":52},[35,1429,1265],{"class":45},[35,1431,434],{"class":52},[35,1433,1434],{"class":437},"data",[35,1436,450],{"class":52},[35,1438,934],{"class":41},[35,1440,456],{"class":52},[35,1442,459],{"class":41},[35,1444,53],{"class":52},[35,1446,1447,1449,1452],{"class":37,"line":204},[35,1448,914],{"class":41},[35,1450,1451],{"class":52}," s ",[35,1453,1454],{"class":41},"string\n",[35,1456,1457,1459,1461,1463,1465,1467,1470,1472,1475,1477,1479],{"class":37,"line":218},[35,1458,482],{"class":41},[35,1460,485],{"class":52},[35,1462,263],{"class":41},[35,1464,291],{"class":52},[35,1466,928],{"class":45},[35,1468,1469],{"class":52},"(data, ",[35,1471,376],{"class":41},[35,1473,1474],{"class":52},"s); err ",[35,1476,488],{"class":41},[35,1478,491],{"class":271},[35,1480,53],{"class":52},[35,1482,1483,1486],{"class":37,"line":232},[35,1484,1485],{"class":41},"        return",[35,1487,609],{"class":52},[35,1489,1490],{"class":37,"line":247},[35,1491,619],{"class":52},[35,1493,1494],{"class":37,"line":252},[35,1495,1496],{"class":59},"    \u002F\u002F Parse \"$12.34\" → 1234 cents\n",[35,1498,1499,1502,1504,1507,1510,1512,1515,1518,1521,1523,1526],{"class":37,"line":257},[35,1500,1501],{"class":52},"    parts ",[35,1503,263],{"class":41},[35,1505,1506],{"class":52}," strings.",[35,1508,1509],{"class":45},"Split",[35,1511,1047],{"class":52},[35,1513,1514],{"class":45},"TrimPrefix",[35,1516,1517],{"class":52},"(s, ",[35,1519,1520],{"class":72},"\"$\"",[35,1522,942],{"class":52},[35,1524,1525],{"class":72},"\".\"",[35,1527,974],{"class":52},[35,1529,1530,1532,1535,1538,1540,1543,1545,1547,1550,1553,1555,1558],{"class":37,"line":283},[35,1531,482],{"class":41},[35,1533,1534],{"class":45}," len",[35,1536,1537],{"class":52},"(parts) ",[35,1539,488],{"class":41},[35,1541,1542],{"class":271}," 2",[35,1544,494],{"class":52},[35,1546,497],{"class":41},[35,1548,1549],{"class":52}," errors.",[35,1551,1552],{"class":45},"New",[35,1554,434],{"class":52},[35,1556,1557],{"class":72},"\"invalid money format\"",[35,1559,1560],{"class":52},") }\n",[35,1562,1563,1566,1568,1571,1574,1577,1579,1582,1585,1587,1590],{"class":37,"line":300},[35,1564,1565],{"class":52},"    dollars, _ ",[35,1567,263],{"class":41},[35,1569,1570],{"class":52}," strconv.",[35,1572,1573],{"class":45},"ParseInt",[35,1575,1576],{"class":52},"(parts[",[35,1578,272],{"class":271},[35,1580,1581],{"class":52},"], ",[35,1583,1584],{"class":271},"10",[35,1586,444],{"class":52},[35,1588,1589],{"class":271},"64",[35,1591,974],{"class":52},[35,1593,1594,1597,1599,1601,1603,1605,1608,1610,1612,1614,1616],{"class":37,"line":306},[35,1595,1596],{"class":52},"    cents, _ ",[35,1598,263],{"class":41},[35,1600,1570],{"class":52},[35,1602,1573],{"class":45},[35,1604,1576],{"class":52},[35,1606,1607],{"class":271},"1",[35,1609,1581],{"class":52},[35,1611,1584],{"class":271},[35,1613,444],{"class":52},[35,1615,1589],{"class":271},[35,1617,974],{"class":52},[35,1619,1620,1623,1625,1628,1630,1632,1635],{"class":37,"line":312},[35,1621,1622],{"class":52},"    m.cents ",[35,1624,387],{"class":41},[35,1626,1627],{"class":52}," dollars",[35,1629,1423],{"class":41},[35,1631,1381],{"class":271},[35,1633,1634],{"class":41}," +",[35,1636,1637],{"class":52}," cents\n",[35,1639,1640,1642],{"class":37,"line":317},[35,1641,624],{"class":41},[35,1643,627],{"class":271},[35,1645,1646],{"class":37,"line":323},[35,1647,161],{"class":52},[35,1649,1650],{"class":37,"line":335},[35,1651,168],{"emptyLinePlaceholder":167},[35,1653,1654,1656,1659,1661],{"class":37,"line":348},[35,1655,42],{"class":41},[35,1657,1658],{"class":45}," Product",[35,1660,49],{"class":41},[35,1662,53],{"class":52},[35,1664,1665,1668,1670],{"class":37,"line":353},[35,1666,1667],{"class":52},"    Price ",[35,1669,1323],{"class":45},[35,1671,1672],{"class":72}," `json:\"price\"`\n",[35,1674,1675],{"class":37,"line":364},[35,1676,161],{"class":52},[35,1678,1679,1682,1684,1686,1689,1691,1694,1697],{"class":37,"line":382},[35,1680,1681],{"class":52},"p ",[35,1683,263],{"class":41},[35,1685,1658],{"class":45},[35,1687,1688],{"class":52},"{Price: ",[35,1690,1323],{"class":45},[35,1692,1693],{"class":52},"{cents: ",[35,1695,1696],{"class":271},"1234",[35,1698,1699],{"class":52},"}}\n",[35,1701,1702,1704,1706,1708,1710],{"class":37,"line":397},[35,1703,286],{"class":52},[35,1705,263],{"class":41},[35,1707,291],{"class":52},[35,1709,294],{"class":45},[35,1711,1712],{"class":52},"(p)\n",[35,1714,1715],{"class":37,"line":790},[35,1716,1717],{"class":59},"\u002F\u002F {\"price\":\"$12.34\"}\n",[14,1719,1721],{"id":1720},"json-handling-null-and-empty","JSON — Handling Null and Empty",[23,1723,1724,1962,1966],{"language":25},[27,1725,1727],{"className":29,"code":1726,"language":25,"meta":31,"style":31},"type Nullable struct {\n    \u002F\u002F *string: nil → \"null\", \"\" → `\"\"`, \"x\" → `\"x\"`\n    Optional *string `json:\"optional\"`\n\n    \u002F\u002F []string: nil → \"null\", []string{} → \"[]\"\n    Tags []string `json:\"tags\"`\n\n    \u002F\u002F string: \"\" → `\"\"` (always present unless omitempty)\n    Name string `json:\"name\"`\n}\n\nfunc nullDemo() {\n    \u002F\u002F nil pointer and nil slice → \"null\":\n    n1 := Nullable{}\n    data, _ := json.Marshal(n1)\n    \u002F\u002F {\"optional\":null,\"tags\":null,\"name\":\"\"}\n\n    \u002F\u002F Non-nil empty slice → \"[]\":\n    n2 := Nullable{Tags: []string{}}\n    data, _ = json.Marshal(n2)\n    \u002F\u002F {\"optional\":null,\"tags\":[],\"name\":\"\"}\n\n    \u002F\u002F Non-nil pointer → the string value:\n    s := \"\"\n    n3 := Nullable{Optional: &s}\n    data, _ = json.Marshal(n3)\n    \u002F\u002F {\"optional\":\"\",\"tags\":null,\"name\":\"\"}\n}\n\n\u002F\u002F For APIs: distinguish \"field absent\" (null) from \"field is empty\" (\"\")\n\u002F\u002F Use *string (null = absent, \"\" = explicitly empty).\n",[19,1728,1729,1740,1745,1757,1761,1766,1776,1780,1785,1795,1799,1803,1812,1817,1829,1843,1848,1852,1857,1873,1886,1891,1895,1900,1909,1926,1939,1944,1948,1952,1957],{"__ignoreMap":31},[35,1730,1731,1733,1736,1738],{"class":37,"line":38},[35,1732,42],{"class":41},[35,1734,1735],{"class":45}," Nullable",[35,1737,49],{"class":41},[35,1739,53],{"class":52},[35,1741,1742],{"class":37,"line":56},[35,1743,1744],{"class":59},"    \u002F\u002F *string: nil → \"null\", \"\" → `\"\"`, \"x\" → `\"x\"`\n",[35,1746,1747,1750,1752,1754],{"class":37,"line":63},[35,1748,1749],{"class":52},"    Optional ",[35,1751,1423],{"class":41},[35,1753,85],{"class":41},[35,1755,1756],{"class":72}," `json:\"optional\"`\n",[35,1758,1759],{"class":37,"line":79},[35,1760,168],{"emptyLinePlaceholder":167},[35,1762,1763],{"class":37,"line":94},[35,1764,1765],{"class":59},"    \u002F\u002F []string: nil → \"null\", []string{} → \"[]\"\n",[35,1767,1768,1771,1773],{"class":37,"line":108},[35,1769,1770],{"class":52},"    Tags []",[35,1772,85],{"class":41},[35,1774,1775],{"class":72}," `json:\"tags\"`\n",[35,1777,1778],{"class":37,"line":122},[35,1779,168],{"emptyLinePlaceholder":167},[35,1781,1782],{"class":37,"line":137},[35,1783,1784],{"class":59},"    \u002F\u002F string: \"\" → `\"\"` (always present unless omitempty)\n",[35,1786,1787,1790,1792],{"class":37,"line":158},[35,1788,1789],{"class":52},"    Name ",[35,1791,85],{"class":41},[35,1793,1794],{"class":72}," `json:\"name\"`\n",[35,1796,1797],{"class":37,"line":164},[35,1798,161],{"class":52},[35,1800,1801],{"class":37,"line":171},[35,1802,168],{"emptyLinePlaceholder":167},[35,1804,1805,1807,1810],{"class":37,"line":177},[35,1806,428],{"class":41},[35,1808,1809],{"class":45}," nullDemo",[35,1811,909],{"class":52},[35,1813,1814],{"class":37,"line":189},[35,1815,1816],{"class":59},"    \u002F\u002F nil pointer and nil slice → \"null\":\n",[35,1818,1819,1822,1824,1826],{"class":37,"line":204},[35,1820,1821],{"class":52},"    n1 ",[35,1823,263],{"class":41},[35,1825,1735],{"class":45},[35,1827,1828],{"class":52},"{}\n",[35,1830,1831,1834,1836,1838,1840],{"class":37,"line":218},[35,1832,1833],{"class":52},"    data, _ ",[35,1835,263],{"class":41},[35,1837,291],{"class":52},[35,1839,294],{"class":45},[35,1841,1842],{"class":52},"(n1)\n",[35,1844,1845],{"class":37,"line":232},[35,1846,1847],{"class":59},"    \u002F\u002F {\"optional\":null,\"tags\":null,\"name\":\"\"}\n",[35,1849,1850],{"class":37,"line":247},[35,1851,168],{"emptyLinePlaceholder":167},[35,1853,1854],{"class":37,"line":252},[35,1855,1856],{"class":59},"    \u002F\u002F Non-nil empty slice → \"[]\":\n",[35,1858,1859,1862,1864,1866,1869,1871],{"class":37,"line":257},[35,1860,1861],{"class":52},"    n2 ",[35,1863,263],{"class":41},[35,1865,1735],{"class":45},[35,1867,1868],{"class":52},"{Tags: []",[35,1870,85],{"class":41},[35,1872,280],{"class":52},[35,1874,1875,1877,1879,1881,1883],{"class":37,"line":283},[35,1876,1833],{"class":52},[35,1878,387],{"class":41},[35,1880,291],{"class":52},[35,1882,294],{"class":45},[35,1884,1885],{"class":52},"(n2)\n",[35,1887,1888],{"class":37,"line":300},[35,1889,1890],{"class":59},"    \u002F\u002F {\"optional\":null,\"tags\":[],\"name\":\"\"}\n",[35,1892,1893],{"class":37,"line":306},[35,1894,168],{"emptyLinePlaceholder":167},[35,1896,1897],{"class":37,"line":312},[35,1898,1899],{"class":59},"    \u002F\u002F Non-nil pointer → the string value:\n",[35,1901,1902,1904,1906],{"class":37,"line":317},[35,1903,1349],{"class":52},[35,1905,263],{"class":41},[35,1907,1908],{"class":72}," \"\"\n",[35,1910,1911,1914,1916,1918,1921,1923],{"class":37,"line":323},[35,1912,1913],{"class":52},"    n3 ",[35,1915,263],{"class":41},[35,1917,1735],{"class":45},[35,1919,1920],{"class":52},"{Optional: ",[35,1922,376],{"class":41},[35,1924,1925],{"class":52},"s}\n",[35,1927,1928,1930,1932,1934,1936],{"class":37,"line":335},[35,1929,1833],{"class":52},[35,1931,387],{"class":41},[35,1933,291],{"class":52},[35,1935,294],{"class":45},[35,1937,1938],{"class":52},"(n3)\n",[35,1940,1941],{"class":37,"line":348},[35,1942,1943],{"class":59},"    \u002F\u002F {\"optional\":\"\",\"tags\":null,\"name\":\"\"}\n",[35,1945,1946],{"class":37,"line":353},[35,1947,161],{"class":52},[35,1949,1950],{"class":37,"line":364},[35,1951,168],{"emptyLinePlaceholder":167},[35,1953,1954],{"class":37,"line":382},[35,1955,1956],{"class":59},"\u002F\u002F For APIs: distinguish \"field absent\" (null) from \"field is empty\" (\"\")\n",[35,1958,1959],{"class":37,"line":397},[35,1960,1961],{"class":59},"\u002F\u002F Use *string (null = absent, \"\" = explicitly empty).\n",[14,1963,1965],{"id":1964},"csv-streaming-readwrite","CSV — Streaming Read\u002FWrite",[23,1967,1968,2314,2321],{"language":25},[27,1969,1971],{"className":29,"code":1970,"language":25,"meta":31,"style":31},"import \"encoding\u002Fcsv\"\n\nfunc readCSV(path string) ([][]string, error) {\n    f, err := os.Open(path)\n    if err != nil { return nil, err }\n    defer f.Close()\n\n    r := csv.NewReader(f)\n    r.FieldsPerRecord = -1  \u002F\u002F allow variable columns per row\n    \u002F\u002F r.Comma = ';'  \u002F\u002F change delimiter (default is comma)\n\n    records, err := r.ReadAll()  \u002F\u002F reads all into memory\n    \u002F\u002F For large files, read one at a time:\n    \u002F\u002F for { record, err := r.Read(); if err == io.EOF { break }; ... }\n    return records, err\n}\n\nfunc writeCSV(path string, records [][]string) error {\n    f, err := os.Create(path)\n    if err != nil { return err }\n    defer f.Close()\n\n    w := csv.NewWriter(f)\n    defer w.Flush()  \u002F\u002F ⚠️ must Flush to write buffered data\n\n    for _, record := range records {\n        if err := w.Write(record); err != nil {\n            return err\n        }\n    }\n    return w.Flush()  \u002F\u002F ✅ check Flush error (defer discards it)\n}\n",[19,1972,1973,1987,1991,2015,2028,2047,2057,2061,2075,2090,2098,2102,2120,2125,2130,2137,2141,2145,2173,2185,2201,2211,2215,2229,2244,2248,2261,2283,2289,2293,2297,2310],{"__ignoreMap":31},[35,1974,1975,1978,1981,1984],{"class":37,"line":38},[35,1976,1977],{"class":41},"import",[35,1979,1980],{"class":72}," \"",[35,1982,1983],{"class":45},"encoding\u002Fcsv",[35,1985,1986],{"class":72},"\"\n",[35,1988,1989],{"class":37,"line":56},[35,1990,168],{"emptyLinePlaceholder":167},[35,1992,1993,1995,1998,2000,2002,2004,2007,2009,2011,2013],{"class":37,"line":63},[35,1994,428],{"class":41},[35,1996,1997],{"class":45}," readCSV",[35,1999,434],{"class":52},[35,2001,438],{"class":437},[35,2003,441],{"class":41},[35,2005,2006],{"class":52},") ([][]",[35,2008,85],{"class":41},[35,2010,444],{"class":52},[35,2012,459],{"class":41},[35,2014,1339],{"class":52},[35,2016,2017,2019,2021,2023,2026],{"class":37,"line":79},[35,2018,466],{"class":52},[35,2020,263],{"class":41},[35,2022,471],{"class":52},[35,2024,2025],{"class":45},"Open",[35,2027,477],{"class":52},[35,2029,2030,2032,2034,2036,2038,2040,2042,2044],{"class":37,"line":94},[35,2031,482],{"class":41},[35,2033,485],{"class":52},[35,2035,488],{"class":41},[35,2037,491],{"class":271},[35,2039,494],{"class":52},[35,2041,497],{"class":41},[35,2043,491],{"class":271},[35,2045,2046],{"class":52},", err }\n",[35,2048,2049,2051,2053,2055],{"class":37,"line":108},[35,2050,505],{"class":41},[35,2052,508],{"class":52},[35,2054,511],{"class":45},[35,2056,514],{"class":52},[35,2058,2059],{"class":37,"line":122},[35,2060,168],{"emptyLinePlaceholder":167},[35,2062,2063,2066,2068,2071,2073],{"class":37,"line":137},[35,2064,2065],{"class":52},"    r ",[35,2067,263],{"class":41},[35,2069,2070],{"class":52}," csv.",[35,2072,1050],{"class":45},[35,2074,533],{"class":52},[35,2076,2077,2080,2082,2085,2087],{"class":37,"line":158},[35,2078,2079],{"class":52},"    r.FieldsPerRecord ",[35,2081,387],{"class":41},[35,2083,2084],{"class":41}," -",[35,2086,1607],{"class":271},[35,2088,2089],{"class":59},"  \u002F\u002F allow variable columns per row\n",[35,2091,2092,2095],{"class":37,"line":164},[35,2093,2094],{"class":59},"    \u002F\u002F r.Comma = ';'",[35,2096,2097],{"class":59},"  \u002F\u002F change delimiter (default is comma)\n",[35,2099,2100],{"class":37,"line":171},[35,2101,168],{"emptyLinePlaceholder":167},[35,2103,2104,2107,2109,2112,2115,2117],{"class":37,"line":177},[35,2105,2106],{"class":52},"    records, err ",[35,2108,263],{"class":41},[35,2110,2111],{"class":52}," r.",[35,2113,2114],{"class":45},"ReadAll",[35,2116,844],{"class":52},[35,2118,2119],{"class":59},"\u002F\u002F reads all into memory\n",[35,2121,2122],{"class":37,"line":189},[35,2123,2124],{"class":59},"    \u002F\u002F For large files, read one at a time:\n",[35,2126,2127],{"class":37,"line":204},[35,2128,2129],{"class":59},"    \u002F\u002F for { record, err := r.Read(); if err == io.EOF { break }; ... }\n",[35,2131,2132,2134],{"class":37,"line":218},[35,2133,624],{"class":41},[35,2135,2136],{"class":52}," records, err\n",[35,2138,2139],{"class":37,"line":232},[35,2140,161],{"class":52},[35,2142,2143],{"class":37,"line":247},[35,2144,168],{"emptyLinePlaceholder":167},[35,2146,2147,2149,2152,2154,2156,2158,2160,2162,2165,2167,2169,2171],{"class":37,"line":252},[35,2148,428],{"class":41},[35,2150,2151],{"class":45}," writeCSV",[35,2153,434],{"class":52},[35,2155,438],{"class":437},[35,2157,441],{"class":41},[35,2159,444],{"class":52},[35,2161,447],{"class":437},[35,2163,2164],{"class":52}," [][]",[35,2166,85],{"class":41},[35,2168,456],{"class":52},[35,2170,459],{"class":41},[35,2172,53],{"class":52},[35,2174,2175,2177,2179,2181,2183],{"class":37,"line":257},[35,2176,466],{"class":52},[35,2178,263],{"class":41},[35,2180,471],{"class":52},[35,2182,474],{"class":45},[35,2184,477],{"class":52},[35,2186,2187,2189,2191,2193,2195,2197,2199],{"class":37,"line":283},[35,2188,482],{"class":41},[35,2190,485],{"class":52},[35,2192,488],{"class":41},[35,2194,491],{"class":271},[35,2196,494],{"class":52},[35,2198,497],{"class":41},[35,2200,500],{"class":52},[35,2202,2203,2205,2207,2209],{"class":37,"line":300},[35,2204,505],{"class":41},[35,2206,508],{"class":52},[35,2208,511],{"class":45},[35,2210,514],{"class":52},[35,2212,2213],{"class":37,"line":306},[35,2214,168],{"emptyLinePlaceholder":167},[35,2216,2217,2220,2222,2224,2227],{"class":37,"line":312},[35,2218,2219],{"class":52},"    w ",[35,2221,263],{"class":41},[35,2223,2070],{"class":52},[35,2225,2226],{"class":45},"NewWriter",[35,2228,533],{"class":52},[35,2230,2231,2233,2236,2239,2241],{"class":37,"line":317},[35,2232,505],{"class":41},[35,2234,2235],{"class":52}," w.",[35,2237,2238],{"class":45},"Flush",[35,2240,844],{"class":52},[35,2242,2243],{"class":59},"\u002F\u002F ⚠️ must Flush to write buffered data\n",[35,2245,2246],{"class":37,"line":323},[35,2247,168],{"emptyLinePlaceholder":167},[35,2249,2250,2252,2255,2257,2259],{"class":37,"line":335},[35,2251,562],{"class":41},[35,2253,2254],{"class":52}," _, record ",[35,2256,263],{"class":41},[35,2258,570],{"class":41},[35,2260,573],{"class":52},[35,2262,2263,2265,2267,2269,2271,2274,2277,2279,2281],{"class":37,"line":348},[35,2264,578],{"class":41},[35,2266,485],{"class":52},[35,2268,263],{"class":41},[35,2270,2235],{"class":52},[35,2272,2273],{"class":45},"Write",[35,2275,2276],{"class":52},"(record); err ",[35,2278,488],{"class":41},[35,2280,491],{"class":271},[35,2282,53],{"class":52},[35,2284,2285,2287],{"class":37,"line":353},[35,2286,606],{"class":41},[35,2288,609],{"class":52},[35,2290,2291],{"class":37,"line":364},[35,2292,614],{"class":52},[35,2294,2295],{"class":37,"line":382},[35,2296,619],{"class":52},[35,2298,2299,2301,2303,2305,2307],{"class":37,"line":397},[35,2300,624],{"class":41},[35,2302,2235],{"class":52},[35,2304,2238],{"class":45},[35,2306,844],{"class":52},[35,2308,2309],{"class":59},"\u002F\u002F ✅ check Flush error (defer discards it)\n",[35,2311,2312],{"class":37,"line":790},[35,2313,161],{"class":52},[14,2315,2317,2320],{"id":2316},"gob-go-to-go-binary-serialization",[19,2318,2319],{},"gob"," — Go-to-Go Binary Serialization",[23,2322,2323,2692,2696,2786,2790,2924,2928],{"language":25},[27,2324,2326],{"className":29,"code":2325,"language":25,"meta":31,"style":31},"\u002F\u002F gob is Go's binary encoding — faster and smaller than JSON for Go types.\n\u002F\u002F Only works between Go programs (not cross-language).\n\ntype CacheEntry struct {\n    Key   string\n    Value []byte\n    Expiry time.Time\n}\n\nfunc gobEncode(entries []CacheEntry) ([]byte, error) {\n    var buf bytes.Buffer\n    enc := gob.NewEncoder(&buf)\n    for _, e := range entries {\n        if err := enc.Encode(e); err != nil {\n            return nil, err\n        }\n    }\n    return buf.Bytes(), nil\n}\n\nfunc gobDecode(data []byte) ([]CacheEntry, error) {\n    dec := gob.NewDecoder(bytes.NewReader(data))\n    var entries []CacheEntry\n    for {\n        var e CacheEntry\n        if err := dec.Decode(&e); err != nil {\n            if err == io.EOF { break }\n            return nil, err\n        }\n        entries = append(entries, e)\n    }\n    return entries, nil\n}\n\n\u002F\u002F ⚠️ gob requires types to be registered if using interfaces:\n\u002F\u002F gob.Register(MyType{})\n\u002F\u002F Without registration, decoding an interface value panics.\n",[19,2327,2328,2333,2338,2342,2353,2360,2368,2380,2384,2388,2416,2431,2449,2463,2484,2493,2497,2501,2516,2520,2524,2549,2567,2577,2583,2592,2617,2631,2639,2643,2656,2660,2669,2673,2677,2682,2687],{"__ignoreMap":31},[35,2329,2330],{"class":37,"line":38},[35,2331,2332],{"class":59},"\u002F\u002F gob is Go's binary encoding — faster and smaller than JSON for Go types.\n",[35,2334,2335],{"class":37,"line":56},[35,2336,2337],{"class":59},"\u002F\u002F Only works between Go programs (not cross-language).\n",[35,2339,2340],{"class":37,"line":63},[35,2341,168],{"emptyLinePlaceholder":167},[35,2343,2344,2346,2349,2351],{"class":37,"line":79},[35,2345,42],{"class":41},[35,2347,2348],{"class":45}," CacheEntry",[35,2350,49],{"class":41},[35,2352,53],{"class":52},[35,2354,2355,2358],{"class":37,"line":94},[35,2356,2357],{"class":52},"    Key   ",[35,2359,1454],{"class":41},[35,2361,2362,2365],{"class":37,"line":108},[35,2363,2364],{"class":52},"    Value []",[35,2366,2367],{"class":41},"byte\n",[35,2369,2370,2373,2375,2377],{"class":37,"line":122},[35,2371,2372],{"class":52},"    Expiry ",[35,2374,143],{"class":45},[35,2376,146],{"class":52},[35,2378,2379],{"class":45},"Time\n",[35,2381,2382],{"class":37,"line":137},[35,2383,161],{"class":52},[35,2385,2386],{"class":37,"line":158},[35,2387,168],{"emptyLinePlaceholder":167},[35,2389,2390,2392,2395,2397,2400,2402,2405,2408,2410,2412,2414],{"class":37,"line":164},[35,2391,428],{"class":41},[35,2393,2394],{"class":45}," gobEncode",[35,2396,434],{"class":52},[35,2398,2399],{"class":437},"entries",[35,2401,450],{"class":52},[35,2403,2404],{"class":45},"CacheEntry",[35,2406,2407],{"class":52},") ([]",[35,2409,934],{"class":41},[35,2411,444],{"class":52},[35,2413,459],{"class":41},[35,2415,1339],{"class":52},[35,2417,2418,2420,2423,2426,2428],{"class":37,"line":171},[35,2419,914],{"class":41},[35,2421,2422],{"class":52}," buf ",[35,2424,2425],{"class":45},"bytes",[35,2427,146],{"class":52},[35,2429,2430],{"class":45},"Buffer\n",[35,2432,2433,2435,2437,2440,2442,2444,2446],{"class":37,"line":177},[35,2434,523],{"class":52},[35,2436,263],{"class":41},[35,2438,2439],{"class":52}," gob.",[35,2441,530],{"class":45},[35,2443,434],{"class":52},[35,2445,376],{"class":41},[35,2447,2448],{"class":52},"buf)\n",[35,2450,2451,2453,2456,2458,2460],{"class":37,"line":189},[35,2452,562],{"class":41},[35,2454,2455],{"class":52}," _, e ",[35,2457,263],{"class":41},[35,2459,570],{"class":41},[35,2461,2462],{"class":52}," entries {\n",[35,2464,2465,2467,2469,2471,2473,2475,2478,2480,2482],{"class":37,"line":204},[35,2466,578],{"class":41},[35,2468,485],{"class":52},[35,2470,263],{"class":41},[35,2472,585],{"class":52},[35,2474,588],{"class":45},[35,2476,2477],{"class":52},"(e); err ",[35,2479,488],{"class":41},[35,2481,491],{"class":271},[35,2483,53],{"class":52},[35,2485,2486,2488,2490],{"class":37,"line":218},[35,2487,606],{"class":41},[35,2489,491],{"class":271},[35,2491,2492],{"class":52},", err\n",[35,2494,2495],{"class":37,"line":232},[35,2496,614],{"class":52},[35,2498,2499],{"class":37,"line":247},[35,2500,619],{"class":52},[35,2502,2503,2505,2508,2511,2514],{"class":37,"line":252},[35,2504,624],{"class":41},[35,2506,2507],{"class":52}," buf.",[35,2509,2510],{"class":45},"Bytes",[35,2512,2513],{"class":52},"(), ",[35,2515,1404],{"class":271},[35,2517,2518],{"class":37,"line":257},[35,2519,161],{"class":52},[35,2521,2522],{"class":37,"line":283},[35,2523,168],{"emptyLinePlaceholder":167},[35,2525,2526,2528,2531,2533,2535,2537,2539,2541,2543,2545,2547],{"class":37,"line":300},[35,2527,428],{"class":41},[35,2529,2530],{"class":45}," gobDecode",[35,2532,434],{"class":52},[35,2534,1434],{"class":437},[35,2536,450],{"class":52},[35,2538,934],{"class":41},[35,2540,2407],{"class":52},[35,2542,2404],{"class":45},[35,2544,444],{"class":52},[35,2546,459],{"class":41},[35,2548,1339],{"class":52},[35,2550,2551,2553,2555,2557,2559,2562,2564],{"class":37,"line":306},[35,2552,671],{"class":52},[35,2554,263],{"class":41},[35,2556,2439],{"class":52},[35,2558,678],{"class":45},[35,2560,2561],{"class":52},"(bytes.",[35,2563,1050],{"class":45},[35,2565,2566],{"class":52},"(data))\n",[35,2568,2569,2571,2574],{"class":37,"line":312},[35,2570,914],{"class":41},[35,2572,2573],{"class":52}," entries []",[35,2575,2576],{"class":45},"CacheEntry\n",[35,2578,2579,2581],{"class":37,"line":317},[35,2580,562],{"class":41},[35,2582,53],{"class":52},[35,2584,2585,2587,2590],{"class":37,"line":323},[35,2586,691],{"class":41},[35,2588,2589],{"class":52}," e ",[35,2591,2576],{"class":45},[35,2593,2594,2596,2598,2600,2602,2604,2606,2608,2611,2613,2615],{"class":37,"line":335},[35,2595,578],{"class":41},[35,2597,485],{"class":52},[35,2599,263],{"class":41},[35,2601,708],{"class":52},[35,2603,711],{"class":45},[35,2605,434],{"class":52},[35,2607,376],{"class":41},[35,2609,2610],{"class":52},"e); err ",[35,2612,488],{"class":41},[35,2614,491],{"class":271},[35,2616,53],{"class":52},[35,2618,2619,2621,2623,2625,2627,2629],{"class":37,"line":348},[35,2620,729],{"class":41},[35,2622,485],{"class":52},[35,2624,734],{"class":41},[35,2626,737],{"class":52},[35,2628,740],{"class":41},[35,2630,743],{"class":52},[35,2632,2633,2635,2637],{"class":37,"line":353},[35,2634,606],{"class":41},[35,2636,491],{"class":271},[35,2638,2492],{"class":52},[35,2640,2641],{"class":37,"line":364},[35,2642,614],{"class":52},[35,2644,2645,2648,2650,2653],{"class":37,"line":382},[35,2646,2647],{"class":52},"        entries ",[35,2649,387],{"class":41},[35,2651,2652],{"class":45}," append",[35,2654,2655],{"class":52},"(entries, e)\n",[35,2657,2658],{"class":37,"line":397},[35,2659,619],{"class":52},[35,2661,2662,2664,2667],{"class":37,"line":790},[35,2663,624],{"class":41},[35,2665,2666],{"class":52}," entries, ",[35,2668,1404],{"class":271},[35,2670,2671],{"class":37,"line":822},[35,2672,161],{"class":52},[35,2674,2675],{"class":37,"line":835},[35,2676,168],{"emptyLinePlaceholder":167},[35,2678,2679],{"class":37,"line":850},[35,2680,2681],{"class":59},"\u002F\u002F ⚠️ gob requires types to be registered if using interfaces:\n",[35,2683,2684],{"class":37,"line":862},[35,2685,2686],{"class":59},"\u002F\u002F gob.Register(MyType{})\n",[35,2688,2689],{"class":37,"line":867},[35,2690,2691],{"class":59},"\u002F\u002F Without registration, decoding an interface value panics.\n",[14,2693,2695],{"id":2694},"tips-tricks","💡 Tips & Tricks",[2697,2698,2699,2719,2735,2743,2758,2768],"ul",{},[2700,2701,2702,2706,2707,408,2709,2712,2713,2715,2716,2718],"li",{},[2703,2704,2705],"strong",{},"Idiom",": use ",[19,2708,128],{},[19,2710,2711],{},"*string"," for fields where zero value is valid — ",[19,2714,21],{}," omits zero values, which drops valid 0\u002F\"\"\u002Ffalse. ",[19,2717,128],{}," lets nil=omit, 0=include.",[2700,2720,2721,2706,2723,2726,2727,2730,2731,2734],{},[2703,2722,2705],{},[19,2724,2725],{},"json.Decoder"," for streaming (HTTP bodies, large files) — ",[19,2728,2729],{},"json.Unmarshal"," buffers everything. ",[19,2732,2733],{},"Decoder.Decode"," reads one value at a time.",[2700,2736,2737,2706,2739,2742],{},[2703,2738,2705],{},[19,2740,2741],{},"DisallowUnknownFields()"," for strict API contracts — catches typos in JSON field names (client sends \"usrname\" instead of \"username\" → error, not silent ignore).",[2700,2744,2745,2706,2747,2750,2751,2753,2754,2757],{},[2703,2746,2705],{},[19,2748,2749],{},"UseNumber()"," when decoding into ",[19,2752,971],{}," and you need integer precision — ",[19,2755,2756],{},"json.Number"," is string-backed, preserving exact values. For known schemas, use typed structs.",[2700,2759,2760,2762,2763,408,2765,2767],{},[2703,2761,2705],{},": implement ",[19,2764,1262],{},[19,2766,1265],{}," for custom serialization (Money as string, timestamps in a specific format, redacted fields). This is cleaner than post-processing the JSON.",[2700,2769,2770,2773,2774,2777,2778,2781,2782,2785],{},[2703,2771,2772],{},"Safety",": ",[19,2775,2776],{},"csv.Writer.Flush()"," can fail — don't rely on ",[19,2779,2780],{},"defer w.Flush()"," (error discarded). Call ",[19,2783,2784],{},"w.Flush()"," explicitly and check the error.",[14,2787,2789],{"id":2788},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[2697,2791,2792,2811,2833,2852,2860,2875,2886,2900,2912],{},[2700,2793,2794,2773,2799,2802,2803,2805,2806,2808,2809,146],{},[2703,2795,2796,2798],{},[19,2797,21],{}," omits valid zero values",[19,2800,2801],{},"Count int"," with ",[19,2804,21],{}," → ",[19,2807,272],{}," is omitted. If 0 is valid, use ",[19,2810,128],{},[2700,2812,2813,2773,2819,2805,2822,2825,2826,2805,2829,2832],{},[2703,2814,2815,2816,2818],{},"nil slice → \"null\", empty slice → \"",[35,2817],{},"\"",[19,2820,2821],{},"var s []int",[19,2823,2824],{},"null","; ",[19,2827,2828],{},"[]int{}",[19,2830,2831],{},"[]",". APIs may treat these differently — be deliberate.",[2700,2834,2835,2845,2846,2848,2849,2851],{},[2703,2836,2837,2839,2840,2842,2843],{},[19,2838,2729],{}," into ",[19,2841,971],{}," makes numbers ",[19,2844,877],{},": asserting to ",[19,2847,195],{}," panics. Use ",[19,2850,1064],{}," or typed structs.",[2700,2853,2854,2773,2857,2859],{},[2703,2855,2856],{},"Unknown JSON fields are ignored by default",[19,2858,2741],{}," makes it an error. Without it, a typo in a field name is silently ignored (data lost).",[2700,2861,2862,2773,2868,2871,2872,146],{},[2703,2863,2864,2867],{},[19,2865,2866],{},"time.Time"," is serialized as RFC3339 by default",[19,2869,2870],{},"{\"created_at\":\"2024-03-15T14:30:00Z\"}",". Parse with ",[19,2873,2874],{},"time.Parse(time.RFC3339, ...)",[2700,2876,2877,2773,2882,2885],{},[2703,2878,2879,2881],{},[19,2880,2319],{}," requires type registration for interfaces",[19,2883,2884],{},"gob.Register(MyType{})"," before encoding\u002Fdecoding interface values. Without it, decode panics.",[2700,2887,2888,2773,2894,2896,2897,2899],{},[2703,2889,2890,2893],{},[19,2891,2892],{},"csv.Writer"," must be flushed",[19,2895,2780],{}," discards the error. Call ",[19,2898,2784],{}," explicitly and check the return.",[2700,2901,2902,2908,2909,2911],{},[2703,2903,2904,2905,2907],{},"Large JSON → ",[19,2906,2729],{}," allocates everything",": for large responses, use ",[19,2910,2725],{}," to stream-record by record.",[2700,2913,2914,2920,2921,2923],{},[2703,2915,2916,2919],{},[19,2917,2918],{},"json.Marshal"," panics on cyclic structures",": a struct that references itself (directly or via a cycle) causes an infinite loop in ",[19,2922,294],{}," → stack overflow.",[14,2925,2927],{"id":2926},"quick-quiz","🧠 Quick Quiz",[23,2929,2930,3024],{"language":25},[27,2931,2933],{"className":29,"code":2932,"language":25,"meta":31,"style":31},"type T struct {\n    A int    `json:\"a\"`\n    B string `json:\"b,omitempty\"`\n    C *int   `json:\"c,omitempty\"`\n}\n\nt := T{A: 0, B: \"\", C: nil}\ndata, _ := json.Marshal(t)\n",[19,2934,2935,2946,2956,2966,2976,2980,2984,3011],{"__ignoreMap":31},[35,2936,2937,2939,2942,2944],{"class":37,"line":38},[35,2938,42],{"class":41},[35,2940,2941],{"class":45}," T",[35,2943,49],{"class":41},[35,2945,53],{"class":52},[35,2947,2948,2951,2953],{"class":37,"line":56},[35,2949,2950],{"class":52},"    A ",[35,2952,195],{"class":41},[35,2954,2955],{"class":72},"    `json:\"a\"`\n",[35,2957,2958,2961,2963],{"class":37,"line":63},[35,2959,2960],{"class":52},"    B ",[35,2962,85],{"class":41},[35,2964,2965],{"class":72}," `json:\"b,omitempty\"`\n",[35,2967,2968,2971,2973],{"class":37,"line":79},[35,2969,2970],{"class":52},"    C ",[35,2972,128],{"class":41},[35,2974,2975],{"class":72},"   `json:\"c,omitempty\"`\n",[35,2977,2978],{"class":37,"line":94},[35,2979,161],{"class":52},[35,2981,2982],{"class":37,"line":108},[35,2983,168],{"emptyLinePlaceholder":167},[35,2985,2986,2989,2991,2993,2996,2998,3001,3003,3006,3009],{"class":37,"line":122},[35,2987,2988],{"class":52},"t ",[35,2990,263],{"class":41},[35,2992,2941],{"class":45},[35,2994,2995],{"class":52},"{A: ",[35,2997,272],{"class":271},[35,2999,3000],{"class":52},", B: ",[35,3002,546],{"class":72},[35,3004,3005],{"class":52},", C: ",[35,3007,3008],{"class":271},"nil",[35,3010,161],{"class":52},[35,3012,3013,3015,3017,3019,3021],{"class":37,"line":137},[35,3014,286],{"class":52},[35,3016,263],{"class":41},[35,3018,291],{"class":52},[35,3020,294],{"class":45},[35,3022,3023],{"class":52},"(t)\n",[3025,3026,3027],"p",{},"What's the JSON output?",[3029,3030,3031,3035,3056,3090,3096],"details",{},[3032,3033,3034],"summary",{},"Answer",[27,3036,3039],{"className":3037,"code":3038,"language":1122,"meta":31,"style":31},"language-json shiki shiki-themes github-light github-dark","{\"a\":0}\n",[19,3040,3041],{"__ignoreMap":31},[35,3042,3043,3046,3049,3052,3054],{"class":37,"line":38},[35,3044,3045],{"class":52},"{",[35,3047,3048],{"class":271},"\"a\"",[35,3050,3051],{"class":52},":",[35,3053,272],{"class":271},[35,3055,161],{"class":52},[2697,3057,3058,3070,3082],{},[2700,3059,3060,2805,3063,3066,3067,3069],{},[19,3061,3062],{},"A",[19,3064,3065],{},"\"a\":0"," — no ",[19,3068,21],{},", always included.",[2700,3071,3072,3075,3076,3078,3079,3081],{},[19,3073,3074],{},"B"," → omitted — ",[19,3077,21],{}," + zero value (",[19,3080,546],{},").",[2700,3083,3084,3075,3087,3089],{},[19,3085,3086],{},"C",[19,3088,21],{}," + nil pointer.",[3025,3091,3092,3093,3095],{},"So only ",[19,3094,3062],{}," appears.",[3025,3097,3098,3099,3101,3102,3104,3105,3107,3108,3110,3111,2805,3114,146],{},"If you wanted to include ",[19,3100,3074],{}," even when empty, remove ",[19,3103,21],{},". If you wanted to include ",[19,3106,3086],{}," with a value, set ",[19,3109,3086],{}," to a non-nil pointer: ",[19,3112,3113],{},"c := 0; t.C = &c",[19,3115,3116],{},"\"c\":0",[14,3118,3120],{"id":3119},"whats-next","📚 What's Next",[3025,3122,3123,3124,3129,3130,3132,3133,3136],{},"→ ",[3125,3126,3128],"a",{"href":3127},"\u002Fgo\u002F24-time-and-dates","24 — Time & Dates"," — monotonic clock, the reference time format, time zones, and the ",[19,3131,734],{}," vs ",[19,3134,3135],{},"Equal"," trap.",[3138,3139,3140],"style",{},"html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .sCrzJ, html code.shiki .sCrzJ{--shiki-default:#E36209;--shiki-github-dark:#FFAB70}",{"title":31,"searchDepth":56,"depth":56,"links":3142},[3143,3145,3147],{"id":16,"depth":56,"text":3144},"JSON — Struct Tags and omitempty",{"id":403,"depth":56,"text":3146},"JSON — Streaming with json.Encoder\u002FDecoder",{"id":3119,"depth":56,"text":3120},"Struct tag mechanics, streaming JSON, json.Number precision, custom marshalers, CSV streaming, and gob for Go-to-Go serialization.","md",{},"\u002Fgo\u002F23-encoding",{"title":5,"description":3148},"go\u002F23-encoding","Kd_pQZBFIepNgJ2Ami6ZFBnuYkuPDdUn-cYo7hROD4A",1789924648747]