[{"data":1,"prerenderedAt":4532},["ShallowReactive",2],{"content:\u002F01-basics\u002F02-arrays-slices":3},{"title":4,"description":5,"path":6,"body":7},"Массивы и слайсы","Если скалярные типы — это отдельные переменные, то массивы и слайсы — это способ работать с последовательностями данных. В большинстве языков это одна сущность. В Go это два принципиально разных инструмента с разной семантикой, и понимание разницы между ними — один из первых маркеров опытного Go-разработчика.","\u002F01-basics\u002F02-arrays-slices",{"type":8,"value":9,"toc":4510},"minimark",[10,15,18,21,26,38,150,165,205,208,213,313,316,420,427,429,433,440,494,515,579,582,586,680,697,821,824,828,838,943,949,951,955,961,1017,1023,1025,1029,1034,1092,1105,1109,1119,1143,1152,1305,1309,1315,1445,1451,1563,1565,1569,1578,1676,1681,1685,1841,1858,1862,1867,1973,1975,1979,1982,2145,2148,2237,2255,2257,2261,2264,2270,2401,2407,2525,2527,2531,2553,2573,2595,2616,2634,2651,2700,2735,2758,2783,2796,2816,2837,2839,2843,2972,3127,3314,3518,3520,3524,3526,3531,3537,3543,3553,3558,3566,3571,3793,3795,3800,3805,3810,3815,4038,4043,4049,4053,4111,4113,4118,4123,4128,4136,4140,4146,4152,4156,4506],[11,12,14],"h1",{"id":13},"массив-и-слайс-в-go","Массив и слайс в Go",[16,17,5],"p",{},[19,20],"hr",{},[22,23,25],"h2",{"id":24},"массив-значимый-тип-фиксированного-размера","Массив — значимый тип фиксированного размера",[16,27,28,29,33,34,37],{},"Массив в Go — это ",[30,31,32],"strong",{},"значимый тип"," (value type). Это означает, что при присвоении или передаче в функцию массив ",[30,35,36],{},"копируется целиком",".",[39,40,45],"pre",{"className":41,"code":42,"language":43,"meta":44,"style":44},"language-go shiki shiki-themes github-dark","var a [3]int              \u002F\u002F [0 0 0] — zero value для каждого элемента\nb := [3]int{1, 2, 3}     \u002F\u002F литерал\nc := [...]int{1, 2, 3}   \u002F\u002F компилятор считает размер сам — тоже [3]int\n","go","",[46,47,48,75,115],"code",{"__ignoreMap":44},[49,50,53,57,61,65,68,71],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"snl16","var",[49,58,60],{"class":59},"s95oV"," a [",[49,62,64],{"class":63},"sDLfK","3",[49,66,67],{"class":59},"]",[49,69,70],{"class":55},"int",[49,72,74],{"class":73},"sAwPA","              \u002F\u002F [0 0 0] — zero value для каждого элемента\n",[49,76,78,81,84,87,89,91,93,96,99,102,105,107,109,112],{"class":51,"line":77},2,[49,79,80],{"class":59},"b ",[49,82,83],{"class":55},":=",[49,85,86],{"class":59}," [",[49,88,64],{"class":63},[49,90,67],{"class":59},[49,92,70],{"class":55},[49,94,95],{"class":59},"{",[49,97,98],{"class":63},"1",[49,100,101],{"class":59},", ",[49,103,104],{"class":63},"2",[49,106,101],{"class":59},[49,108,64],{"class":63},[49,110,111],{"class":59},"}     ",[49,113,114],{"class":73},"\u002F\u002F литерал\n",[49,116,118,121,123,125,128,130,132,134,136,138,140,142,144,147],{"class":51,"line":117},3,[49,119,120],{"class":59},"c ",[49,122,83],{"class":55},[49,124,86],{"class":59},[49,126,127],{"class":55},"...",[49,129,67],{"class":59},[49,131,70],{"class":55},[49,133,95],{"class":59},[49,135,98],{"class":63},[49,137,101],{"class":59},[49,139,104],{"class":63},[49,141,101],{"class":59},[49,143,64],{"class":63},[49,145,146],{"class":59},"}   ",[49,148,149],{"class":73},"\u002F\u002F компилятор считает размер сам — тоже [3]int\n",[16,151,152,153,156,157,160,161,164],{},"Размер массива — часть его типа. ",[46,154,155],{},"[3]int"," и ",[46,158,159],{},"[4]int"," — это ",[30,162,163],{},"разные типы",", и компилятор не позволит их смешивать:",[39,166,168],{"className":41,"code":167,"language":43,"meta":44,"style":44},"var a [3]int\nvar b [4]int\n\u002F\u002F a = b \u002F\u002F Ошибка компиляции: cannot use b (type [4]int) as type [3]int\n",[46,169,170,183,197],{"__ignoreMap":44},[49,171,172,174,176,178,180],{"class":51,"line":52},[49,173,56],{"class":55},[49,175,60],{"class":59},[49,177,64],{"class":63},[49,179,67],{"class":59},[49,181,182],{"class":55},"int\n",[49,184,185,187,190,193,195],{"class":51,"line":77},[49,186,56],{"class":55},[49,188,189],{"class":59}," b [",[49,191,192],{"class":63},"4",[49,194,67],{"class":59},[49,196,182],{"class":55},[49,198,199,202],{"class":51,"line":117},[49,200,201],{"class":73},"\u002F\u002F a = b",[49,203,204],{"class":73}," \u002F\u002F Ошибка компиляции: cannot use b (type [4]int) as type [3]int\n",[16,206,207],{},"Из этого следует важное следствие: размер массива должен быть известен на этапе компиляции. Передать в функцию \"массив любого размера\" невозможно — именно поэтому в реальном коде массивы используются редко, а слайсы — повсеместно.",[209,210,212],"h3",{"id":211},"копирование-при-присвоении","Копирование при присвоении",[39,214,216],{"className":41,"code":215,"language":43,"meta":44,"style":44},"a := [3]int{1, 2, 3}\nb := a        \u002F\u002F полная копия всех данных\nb[0] = 99\n\nfmt.Println(a) \u002F\u002F [1 2 3] — не изменился\nfmt.Println(b) \u002F\u002F [99 2 3]\n",[46,217,218,248,260,277,284,300],{"__ignoreMap":44},[49,219,220,223,225,227,229,231,233,235,237,239,241,243,245],{"class":51,"line":52},[49,221,222],{"class":59},"a ",[49,224,83],{"class":55},[49,226,86],{"class":59},[49,228,64],{"class":63},[49,230,67],{"class":59},[49,232,70],{"class":55},[49,234,95],{"class":59},[49,236,98],{"class":63},[49,238,101],{"class":59},[49,240,104],{"class":63},[49,242,101],{"class":59},[49,244,64],{"class":63},[49,246,247],{"class":59},"}\n",[49,249,250,252,254,257],{"class":51,"line":77},[49,251,80],{"class":59},[49,253,83],{"class":55},[49,255,256],{"class":59}," a        ",[49,258,259],{"class":73},"\u002F\u002F полная копия всех данных\n",[49,261,262,265,268,271,274],{"class":51,"line":117},[49,263,264],{"class":59},"b[",[49,266,267],{"class":63},"0",[49,269,270],{"class":59},"] ",[49,272,273],{"class":55},"=",[49,275,276],{"class":63}," 99\n",[49,278,280],{"class":51,"line":279},4,[49,281,283],{"emptyLinePlaceholder":282},true,"\n",[49,285,287,290,294,297],{"class":51,"line":286},5,[49,288,289],{"class":59},"fmt.",[49,291,293],{"class":292},"svObZ","Println",[49,295,296],{"class":59},"(a) ",[49,298,299],{"class":73},"\u002F\u002F [1 2 3] — не изменился\n",[49,301,303,305,307,310],{"class":51,"line":302},6,[49,304,289],{"class":59},[49,306,293],{"class":292},[49,308,309],{"class":59},"(b) ",[49,311,312],{"class":73},"\u002F\u002F [99 2 3]\n",[16,314,315],{},"То же самое происходит при передаче в функцию:",[39,317,319],{"className":41,"code":318,"language":43,"meta":44,"style":44},"func modify(arr [3]int) {\n    arr[0] = 99 \u002F\u002F изменяем копию\n}\n\na := [3]int{1, 2, 3}\nmodify(a)\nfmt.Println(a) \u002F\u002F [1 2 3] — оригинал не тронут\n",[46,320,321,347,364,368,372,400,408],{"__ignoreMap":44},[49,322,323,326,329,332,336,338,340,342,344],{"class":51,"line":52},[49,324,325],{"class":55},"func",[49,327,328],{"class":292}," modify",[49,330,331],{"class":59},"(",[49,333,335],{"class":334},"s9osk","arr",[49,337,86],{"class":59},[49,339,64],{"class":63},[49,341,67],{"class":59},[49,343,70],{"class":55},[49,345,346],{"class":59},") {\n",[49,348,349,352,354,356,358,361],{"class":51,"line":77},[49,350,351],{"class":59},"    arr[",[49,353,267],{"class":63},[49,355,270],{"class":59},[49,357,273],{"class":55},[49,359,360],{"class":63}," 99",[49,362,363],{"class":73}," \u002F\u002F изменяем копию\n",[49,365,366],{"class":51,"line":117},[49,367,247],{"class":59},[49,369,370],{"class":51,"line":279},[49,371,283],{"emptyLinePlaceholder":282},[49,373,374,376,378,380,382,384,386,388,390,392,394,396,398],{"class":51,"line":286},[49,375,222],{"class":59},[49,377,83],{"class":55},[49,379,86],{"class":59},[49,381,64],{"class":63},[49,383,67],{"class":59},[49,385,70],{"class":55},[49,387,95],{"class":59},[49,389,98],{"class":63},[49,391,101],{"class":59},[49,393,104],{"class":63},[49,395,101],{"class":59},[49,397,64],{"class":63},[49,399,247],{"class":59},[49,401,402,405],{"class":51,"line":302},[49,403,404],{"class":292},"modify",[49,406,407],{"class":59},"(a)\n",[49,409,411,413,415,417],{"class":51,"line":410},7,[49,412,289],{"class":59},[49,414,293],{"class":292},[49,416,296],{"class":59},[49,418,419],{"class":73},"\u002F\u002F [1 2 3] — оригинал не тронут\n",[16,421,422,423,426],{},"Для больших массивов это дорого. Чтобы избежать копирования, передают указатель — ",[46,424,425],{},"*[3]int",". Но на практике в таких случаях просто используют слайс.",[19,428],{},[22,430,432],{"id":431},"слайс-три-поля-и-один-массив","Слайс — три поля и один массив",[16,434,435,436,439],{},"Слайс — это ",[30,437,438],{},"дескриптор"," (view) поверх массива. Под капотом это структура из трёх полей:",[39,441,443],{"className":41,"code":442,"language":43,"meta":44,"style":44},"type SliceHeader struct {\n    Data uintptr \u002F\u002F указатель на первый элемент в underlying array\n    Len  int     \u002F\u002F количество элементов, доступных через слайс\n    Cap  int     \u002F\u002F общая ёмкость от Data до конца underlying array\n}\n",[46,444,445,459,470,480,490],{"__ignoreMap":44},[49,446,447,450,453,456],{"class":51,"line":52},[49,448,449],{"class":55},"type",[49,451,452],{"class":292}," SliceHeader",[49,454,455],{"class":55}," struct",[49,457,458],{"class":59}," {\n",[49,460,461,464,467],{"class":51,"line":77},[49,462,463],{"class":59},"    Data ",[49,465,466],{"class":55},"uintptr",[49,468,469],{"class":73}," \u002F\u002F указатель на первый элемент в underlying array\n",[49,471,472,475,477],{"class":51,"line":117},[49,473,474],{"class":59},"    Len  ",[49,476,70],{"class":55},[49,478,479],{"class":73},"     \u002F\u002F количество элементов, доступных через слайс\n",[49,481,482,485,487],{"class":51,"line":279},[49,483,484],{"class":59},"    Cap  ",[49,486,70],{"class":55},[49,488,489],{"class":73},"     \u002F\u002F общая ёмкость от Data до конца underlying array\n",[49,491,492],{"class":51,"line":286},[49,493,247],{"class":59},[16,495,496,497,500,501,504,505,508,509,156,512,37],{},"Когда вы пишете ",[46,498,499],{},"s := []int{1, 2, 3}",", происходит следующее: где-то в памяти выделяется массив ",[46,502,503],{},"[3]int{1, 2, 3}",", а ",[46,506,507],{},"s"," — это заголовок (16 или 24 байта), который указывает на его начало с ",[46,510,511],{},"Len=3",[46,513,514],{},"Cap=3",[39,516,518],{"className":41,"code":517,"language":43,"meta":44,"style":44},"s := []int{1, 2, 3}\nfmt.Println(len(s)) \u002F\u002F 3 — текущая длина\nfmt.Println(cap(s)) \u002F\u002F 3 — ёмкость\n",[46,519,520,546,563],{"__ignoreMap":44},[49,521,522,525,527,530,532,534,536,538,540,542,544],{"class":51,"line":52},[49,523,524],{"class":59},"s ",[49,526,83],{"class":55},[49,528,529],{"class":59}," []",[49,531,70],{"class":55},[49,533,95],{"class":59},[49,535,98],{"class":63},[49,537,101],{"class":59},[49,539,104],{"class":63},[49,541,101],{"class":59},[49,543,64],{"class":63},[49,545,247],{"class":59},[49,547,548,550,552,554,557,560],{"class":51,"line":77},[49,549,289],{"class":59},[49,551,293],{"class":292},[49,553,331],{"class":59},[49,555,556],{"class":292},"len",[49,558,559],{"class":59},"(s)) ",[49,561,562],{"class":73},"\u002F\u002F 3 — текущая длина\n",[49,564,565,567,569,571,574,576],{"class":51,"line":117},[49,566,289],{"class":59},[49,568,293],{"class":292},[49,570,331],{"class":59},[49,572,573],{"class":292},"cap",[49,575,559],{"class":59},[49,577,578],{"class":73},"\u002F\u002F 3 — ёмкость\n",[16,580,581],{},"Именно потому, что слайс — это заголовок, передача слайса в функцию дешева: копируется только 24 байта заголовка, underlying array не трогается.",[209,583,585],{"id":584},"срезы-slicing-окно-в-тот-же-массив","Срезы (slicing) — окно в тот же массив",[39,587,589],{"className":41,"code":588,"language":43,"meta":44,"style":44},"a := [6]int{1, 2, 3, 4, 5, 6}\n\ns1 := a[1:4]  \u002F\u002F элементы 1, 2, 3 → [2 3 4], len=3, cap=5\ns2 := a[2:5]  \u002F\u002F элементы 2, 3, 4 → [3 4 5], len=3, cap=4\n",[46,590,591,633,637,660],{"__ignoreMap":44},[49,592,593,595,597,599,602,604,606,608,610,612,614,616,618,620,622,624,627,629,631],{"class":51,"line":52},[49,594,222],{"class":59},[49,596,83],{"class":55},[49,598,86],{"class":59},[49,600,601],{"class":63},"6",[49,603,67],{"class":59},[49,605,70],{"class":55},[49,607,95],{"class":59},[49,609,98],{"class":63},[49,611,101],{"class":59},[49,613,104],{"class":63},[49,615,101],{"class":59},[49,617,64],{"class":63},[49,619,101],{"class":59},[49,621,192],{"class":63},[49,623,101],{"class":59},[49,625,626],{"class":63},"5",[49,628,101],{"class":59},[49,630,601],{"class":63},[49,632,247],{"class":59},[49,634,635],{"class":51,"line":77},[49,636,283],{"emptyLinePlaceholder":282},[49,638,639,642,644,647,649,652,654,657],{"class":51,"line":117},[49,640,641],{"class":59},"s1 ",[49,643,83],{"class":55},[49,645,646],{"class":59}," a[",[49,648,98],{"class":63},[49,650,651],{"class":59},":",[49,653,192],{"class":63},[49,655,656],{"class":59},"]  ",[49,658,659],{"class":73},"\u002F\u002F элементы 1, 2, 3 → [2 3 4], len=3, cap=5\n",[49,661,662,665,667,669,671,673,675,677],{"class":51,"line":279},[49,663,664],{"class":59},"s2 ",[49,666,83],{"class":55},[49,668,646],{"class":59},[49,670,104],{"class":63},[49,672,651],{"class":59},[49,674,626],{"class":63},[49,676,656],{"class":59},[49,678,679],{"class":73},"\u002F\u002F элементы 2, 3, 4 → [3 4 5], len=3, cap=4\n",[16,681,682,156,685,688,689,692,693,696],{},[46,683,684],{},"s1",[46,686,687],{},"s2"," — разные заголовки, но они смотрят в ",[30,690,691],{},"один и тот же массив"," ",[46,694,695],{},"a",". Изменение через один слайс видно через другой:",[39,698,700],{"className":41,"code":699,"language":43,"meta":44,"style":44},"a := [6]int{1, 2, 3, 4, 5, 6}\ns1 := a[1:4]  \u002F\u002F [2 3 4], len=3, cap=5\ns2 := a[2:5]  \u002F\u002F [3 4 5], len=3, cap=4\n\ns1[0] = 99\nfmt.Println(a)  \u002F\u002F [1 99 3 4 5 6] — массив изменился\nfmt.Println(s2) \u002F\u002F [3 4 5] — s2[0] = a[2] = 3, не затронут\n",[46,701,702,742,761,780,784,797,809],{"__ignoreMap":44},[49,703,704,706,708,710,712,714,716,718,720,722,724,726,728,730,732,734,736,738,740],{"class":51,"line":52},[49,705,222],{"class":59},[49,707,83],{"class":55},[49,709,86],{"class":59},[49,711,601],{"class":63},[49,713,67],{"class":59},[49,715,70],{"class":55},[49,717,95],{"class":59},[49,719,98],{"class":63},[49,721,101],{"class":59},[49,723,104],{"class":63},[49,725,101],{"class":59},[49,727,64],{"class":63},[49,729,101],{"class":59},[49,731,192],{"class":63},[49,733,101],{"class":59},[49,735,626],{"class":63},[49,737,101],{"class":59},[49,739,601],{"class":63},[49,741,247],{"class":59},[49,743,744,746,748,750,752,754,756,758],{"class":51,"line":77},[49,745,641],{"class":59},[49,747,83],{"class":55},[49,749,646],{"class":59},[49,751,98],{"class":63},[49,753,651],{"class":59},[49,755,192],{"class":63},[49,757,656],{"class":59},[49,759,760],{"class":73},"\u002F\u002F [2 3 4], len=3, cap=5\n",[49,762,763,765,767,769,771,773,775,777],{"class":51,"line":117},[49,764,664],{"class":59},[49,766,83],{"class":55},[49,768,646],{"class":59},[49,770,104],{"class":63},[49,772,651],{"class":59},[49,774,626],{"class":63},[49,776,656],{"class":59},[49,778,779],{"class":73},"\u002F\u002F [3 4 5], len=3, cap=4\n",[49,781,782],{"class":51,"line":279},[49,783,283],{"emptyLinePlaceholder":282},[49,785,786,789,791,793,795],{"class":51,"line":286},[49,787,788],{"class":59},"s1[",[49,790,267],{"class":63},[49,792,270],{"class":59},[49,794,273],{"class":55},[49,796,276],{"class":63},[49,798,799,801,803,806],{"class":51,"line":302},[49,800,289],{"class":59},[49,802,293],{"class":292},[49,804,805],{"class":59},"(a)  ",[49,807,808],{"class":73},"\u002F\u002F [1 99 3 4 5 6] — массив изменился\n",[49,810,811,813,815,818],{"class":51,"line":410},[49,812,289],{"class":59},[49,814,293],{"class":292},[49,816,817],{"class":59},"(s2) ",[49,819,820],{"class":73},"\u002F\u002F [3 4 5] — s2[0] = a[2] = 3, не затронут\n",[16,822,823],{},"Это критически важно понимать: слайс не владеет данными, он только ссылается на них.",[209,825,827],{"id":826},"len-и-cap-в-чём-разница","len и cap — в чём разница",[16,829,830,833,834,837],{},[46,831,832],{},"Len"," — сколько элементов доступно прямо сейчас. ",[46,835,836],{},"Cap"," — сколько элементов можно получить без новой аллокации, расширив слайс до конца underlying array:",[39,839,841],{"className":41,"code":840,"language":43,"meta":44,"style":44},"a := [6]int{1, 2, 3, 4, 5, 6}\ns := a[1:3] \u002F\u002F len=2, cap=5\n\nfmt.Println(s)        \u002F\u002F [2 3]\nfmt.Println(s[:5])    \u002F\u002F [2 3 4 5 6] — расширяем до cap\n\u002F\u002F fmt.Println(s[:6]) \u002F\u002F panic: runtime error: slice bounds out of range\n",[46,842,843,883,902,906,918,935],{"__ignoreMap":44},[49,844,845,847,849,851,853,855,857,859,861,863,865,867,869,871,873,875,877,879,881],{"class":51,"line":52},[49,846,222],{"class":59},[49,848,83],{"class":55},[49,850,86],{"class":59},[49,852,601],{"class":63},[49,854,67],{"class":59},[49,856,70],{"class":55},[49,858,95],{"class":59},[49,860,98],{"class":63},[49,862,101],{"class":59},[49,864,104],{"class":63},[49,866,101],{"class":59},[49,868,64],{"class":63},[49,870,101],{"class":59},[49,872,192],{"class":63},[49,874,101],{"class":59},[49,876,626],{"class":63},[49,878,101],{"class":59},[49,880,601],{"class":63},[49,882,247],{"class":59},[49,884,885,887,889,891,893,895,897,899],{"class":51,"line":77},[49,886,524],{"class":59},[49,888,83],{"class":55},[49,890,646],{"class":59},[49,892,98],{"class":63},[49,894,651],{"class":59},[49,896,64],{"class":63},[49,898,270],{"class":59},[49,900,901],{"class":73},"\u002F\u002F len=2, cap=5\n",[49,903,904],{"class":51,"line":117},[49,905,283],{"emptyLinePlaceholder":282},[49,907,908,910,912,915],{"class":51,"line":279},[49,909,289],{"class":59},[49,911,293],{"class":292},[49,913,914],{"class":59},"(s)        ",[49,916,917],{"class":73},"\u002F\u002F [2 3]\n",[49,919,920,922,924,927,929,932],{"class":51,"line":286},[49,921,289],{"class":59},[49,923,293],{"class":292},[49,925,926],{"class":59},"(s[:",[49,928,626],{"class":63},[49,930,931],{"class":59},"])    ",[49,933,934],{"class":73},"\u002F\u002F [2 3 4 5 6] — расширяем до cap\n",[49,936,937,940],{"class":51,"line":302},[49,938,939],{"class":73},"\u002F\u002F fmt.Println(s[:6])",[49,941,942],{"class":73}," \u002F\u002F panic: runtime error: slice bounds out of range\n",[16,944,945,946,948],{},"Расширить слайс за пределы ",[46,947,573],{}," нельзя — это паника в рантайме.",[19,950],{},[22,952,954],{"id":953},"make-создание-слайса-с-заданным-cap","make — создание слайса с заданным cap",[16,956,957,958,651],{},"Кроме литерального синтаксиса, слайсы создают через ",[46,959,960],{},"make",[39,962,964],{"className":41,"code":963,"language":43,"meta":44,"style":44},"s := make([]int, 3)      \u002F\u002F len=3, cap=3, все элементы 0\ns := make([]int, 3, 10)  \u002F\u002F len=3, cap=10 — зарезервировано место\n",[46,965,966,990],{"__ignoreMap":44},[49,967,968,970,972,975,978,980,982,984,987],{"class":51,"line":52},[49,969,524],{"class":59},[49,971,83],{"class":55},[49,973,974],{"class":292}," make",[49,976,977],{"class":59},"([]",[49,979,70],{"class":55},[49,981,101],{"class":59},[49,983,64],{"class":63},[49,985,986],{"class":59},")      ",[49,988,989],{"class":73},"\u002F\u002F len=3, cap=3, все элементы 0\n",[49,991,992,994,996,998,1000,1002,1004,1006,1008,1011,1014],{"class":51,"line":77},[49,993,524],{"class":59},[49,995,83],{"class":55},[49,997,974],{"class":292},[49,999,977],{"class":59},[49,1001,70],{"class":55},[49,1003,101],{"class":59},[49,1005,64],{"class":63},[49,1007,101],{"class":59},[49,1009,1010],{"class":63},"10",[49,1012,1013],{"class":59},")  ",[49,1015,1016],{"class":73},"\u002F\u002F len=3, cap=10 — зарезервировано место\n",[16,1018,1019,1020,37],{},"Второй вариант полезен, когда заранее известно примерное количество элементов. Это позволяет избежать лишних реаллокаций при ",[46,1021,1022],{},"append",[19,1024],{},[22,1026,1028],{"id":1027},"append-как-работает-рост-слайса","append — как работает рост слайса",[16,1030,1031,1033],{},[46,1032,1022],{}," добавляет элементы в конец слайса и возвращает новый заголовок. Здесь начинается самое интересное.",[39,1035,1037],{"className":41,"code":1036,"language":43,"meta":44,"style":44},"s := []int{1, 2, 3}\ns = append(s, 4)\nfmt.Println(s) \u002F\u002F [1 2 3 4]\n",[46,1038,1039,1063,1080],{"__ignoreMap":44},[49,1040,1041,1043,1045,1047,1049,1051,1053,1055,1057,1059,1061],{"class":51,"line":52},[49,1042,524],{"class":59},[49,1044,83],{"class":55},[49,1046,529],{"class":59},[49,1048,70],{"class":55},[49,1050,95],{"class":59},[49,1052,98],{"class":63},[49,1054,101],{"class":59},[49,1056,104],{"class":63},[49,1058,101],{"class":59},[49,1060,64],{"class":63},[49,1062,247],{"class":59},[49,1064,1065,1067,1069,1072,1075,1077],{"class":51,"line":77},[49,1066,524],{"class":59},[49,1068,273],{"class":55},[49,1070,1071],{"class":292}," append",[49,1073,1074],{"class":59},"(s, ",[49,1076,192],{"class":63},[49,1078,1079],{"class":59},")\n",[49,1081,1082,1084,1086,1089],{"class":51,"line":117},[49,1083,289],{"class":59},[49,1085,293],{"class":292},[49,1087,1088],{"class":59},"(s) ",[49,1090,1091],{"class":73},"\u002F\u002F [1 2 3 4]\n",[16,1093,1094,1095,1097,1098,1100,1101,1104],{},"Всегда присваивайте результат ",[46,1096,1022],{}," обратно в переменную — это не опциональность стиля, а требование корректности. ",[46,1099,1022],{}," может вернуть слайс с новым указателем ",[46,1102,1103],{},"Data",", и если вы проигнорируете возвращаемое значение, работаете со старым заголовком.",[209,1106,1108],{"id":1107},"алгоритм-роста","Алгоритм роста",[16,1110,1111,1112,1115,1116,1118],{},"Когда ",[46,1113,1114],{},"len == cap",", места нет и ",[46,1117,1022],{}," делает следующее:",[1120,1121,1122,1126,1129,1132],"ol",{},[1123,1124,1125],"li",{},"Выделяет новый underlying array большего размера",[1123,1127,1128],{},"Копирует все существующие данные",[1123,1130,1131],{},"Добавляет новый элемент",[1123,1133,1134,1135,1137,1138,1140,1141],{},"Возвращает заголовок с новым ",[46,1136,1103],{},", новым ",[46,1139,832],{}," и новым ",[46,1142,836],{},[16,1144,1145,1146,1149,1150,37],{},"Исторически стратегия роста была \"удвоение до 1024, потом ×1.25\". Начиная с Go 1.18 алгоритм стал более плавным — переход к замедленному росту начинается раньше, формула зависит от текущего размера. Точные значения можно посмотреть в ",[46,1147,1148],{},"runtime\u002Fslice.go",", но суть одна: Go всегда выделяет с запасом, чтобы не реаллоцировать при каждом ",[46,1151,1022],{},[39,1153,1155],{"className":41,"code":1154,"language":43,"meta":44,"style":44},"s := make([]int, 0)\nfor i := 0; i \u003C 8; i++ {\n    s = append(s, i)\n    fmt.Printf(\"len=%d cap=%d\\n\", len(s), cap(s))\n}\n\u002F\u002F len=1 cap=1\n\u002F\u002F len=2 cap=2\n\u002F\u002F len=3 cap=4  ← реаллокация, cap удвоился\n\u002F\u002F len=4 cap=4\n\u002F\u002F len=5 cap=8  ← реаллокация\n\u002F\u002F len=6 cap=8\n\u002F\u002F len=7 cap=8\n\u002F\u002F len=8 cap=8\n",[46,1156,1157,1175,1205,1217,1255,1259,1264,1269,1275,1281,1287,1293,1299],{"__ignoreMap":44},[49,1158,1159,1161,1163,1165,1167,1169,1171,1173],{"class":51,"line":52},[49,1160,524],{"class":59},[49,1162,83],{"class":55},[49,1164,974],{"class":292},[49,1166,977],{"class":59},[49,1168,70],{"class":55},[49,1170,101],{"class":59},[49,1172,267],{"class":63},[49,1174,1079],{"class":59},[49,1176,1177,1180,1183,1185,1188,1191,1194,1197,1200,1203],{"class":51,"line":77},[49,1178,1179],{"class":55},"for",[49,1181,1182],{"class":59}," i ",[49,1184,83],{"class":55},[49,1186,1187],{"class":63}," 0",[49,1189,1190],{"class":59},"; i ",[49,1192,1193],{"class":55},"\u003C",[49,1195,1196],{"class":63}," 8",[49,1198,1199],{"class":59},"; i",[49,1201,1202],{"class":55},"++",[49,1204,458],{"class":59},[49,1206,1207,1210,1212,1214],{"class":51,"line":117},[49,1208,1209],{"class":59},"    s ",[49,1211,273],{"class":55},[49,1213,1071],{"class":292},[49,1215,1216],{"class":59},"(s, i)\n",[49,1218,1219,1222,1225,1227,1231,1234,1237,1240,1243,1245,1247,1250,1252],{"class":51,"line":279},[49,1220,1221],{"class":59},"    fmt.",[49,1223,1224],{"class":292},"Printf",[49,1226,331],{"class":59},[49,1228,1230],{"class":1229},"sU2Wk","\"len=",[49,1232,1233],{"class":63},"%d",[49,1235,1236],{"class":1229}," cap=",[49,1238,1239],{"class":63},"%d\\n",[49,1241,1242],{"class":1229},"\"",[49,1244,101],{"class":59},[49,1246,556],{"class":292},[49,1248,1249],{"class":59},"(s), ",[49,1251,573],{"class":292},[49,1253,1254],{"class":59},"(s))\n",[49,1256,1257],{"class":51,"line":286},[49,1258,247],{"class":59},[49,1260,1261],{"class":51,"line":302},[49,1262,1263],{"class":73},"\u002F\u002F len=1 cap=1\n",[49,1265,1266],{"class":51,"line":410},[49,1267,1268],{"class":73},"\u002F\u002F len=2 cap=2\n",[49,1270,1272],{"class":51,"line":1271},8,[49,1273,1274],{"class":73},"\u002F\u002F len=3 cap=4  ← реаллокация, cap удвоился\n",[49,1276,1278],{"class":51,"line":1277},9,[49,1279,1280],{"class":73},"\u002F\u002F len=4 cap=4\n",[49,1282,1284],{"class":51,"line":1283},10,[49,1285,1286],{"class":73},"\u002F\u002F len=5 cap=8  ← реаллокация\n",[49,1288,1290],{"class":51,"line":1289},11,[49,1291,1292],{"class":73},"\u002F\u002F len=6 cap=8\n",[49,1294,1296],{"class":51,"line":1295},12,[49,1297,1298],{"class":73},"\u002F\u002F len=7 cap=8\n",[49,1300,1302],{"class":51,"line":1301},13,[49,1303,1304],{"class":73},"\u002F\u002F len=8 cap=8\n",[209,1306,1308],{"id":1307},"опасность-общего-underlying-array","Опасность общего underlying array",[16,1310,1311,1312,1314],{},"После ",[46,1313,1022],{}," без реаллокации слайс всё ещё смотрит в тот же массив. Это порождает неочевидный баг:",[39,1316,1318],{"className":41,"code":1317,"language":43,"meta":44,"style":44},"a := make([]int, 3, 6) \u002F\u002F len=3, cap=6\na[0], a[1], a[2] = 1, 2, 3\n\nb := a[:3]           \u002F\u002F b смотрит в тот же массив, cap=6\nb = append(b, 99)    \u002F\u002F len \u003C cap, реаллокации нет — пишем в a[3]\n\nfmt.Println(a[:4])   \u002F\u002F [1 2 3 99] — сюрприз! a \"не знает\" об этом элементе,\n                     \u002F\u002F но данные в памяти изменились\n",[46,1319,1320,1346,1378,1382,1399,1419,1423,1440],{"__ignoreMap":44},[49,1321,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1343],{"class":51,"line":52},[49,1323,222],{"class":59},[49,1325,83],{"class":55},[49,1327,974],{"class":292},[49,1329,977],{"class":59},[49,1331,70],{"class":55},[49,1333,101],{"class":59},[49,1335,64],{"class":63},[49,1337,101],{"class":59},[49,1339,601],{"class":63},[49,1341,1342],{"class":59},") ",[49,1344,1345],{"class":73},"\u002F\u002F len=3, cap=6\n",[49,1347,1348,1351,1353,1356,1358,1360,1362,1364,1366,1369,1371,1373,1375],{"class":51,"line":77},[49,1349,1350],{"class":59},"a[",[49,1352,267],{"class":63},[49,1354,1355],{"class":59},"], a[",[49,1357,98],{"class":63},[49,1359,1355],{"class":59},[49,1361,104],{"class":63},[49,1363,270],{"class":59},[49,1365,273],{"class":55},[49,1367,1368],{"class":63}," 1",[49,1370,101],{"class":59},[49,1372,104],{"class":63},[49,1374,101],{"class":59},[49,1376,1377],{"class":63},"3\n",[49,1379,1380],{"class":51,"line":117},[49,1381,283],{"emptyLinePlaceholder":282},[49,1383,1384,1386,1388,1391,1393,1396],{"class":51,"line":279},[49,1385,80],{"class":59},[49,1387,83],{"class":55},[49,1389,1390],{"class":59}," a[:",[49,1392,64],{"class":63},[49,1394,1395],{"class":59},"]           ",[49,1397,1398],{"class":73},"\u002F\u002F b смотрит в тот же массив, cap=6\n",[49,1400,1401,1403,1405,1407,1410,1413,1416],{"class":51,"line":286},[49,1402,80],{"class":59},[49,1404,273],{"class":55},[49,1406,1071],{"class":292},[49,1408,1409],{"class":59},"(b, ",[49,1411,1412],{"class":63},"99",[49,1414,1415],{"class":59},")    ",[49,1417,1418],{"class":73},"\u002F\u002F len \u003C cap, реаллокации нет — пишем в a[3]\n",[49,1420,1421],{"class":51,"line":302},[49,1422,283],{"emptyLinePlaceholder":282},[49,1424,1425,1427,1429,1432,1434,1437],{"class":51,"line":410},[49,1426,289],{"class":59},[49,1428,293],{"class":292},[49,1430,1431],{"class":59},"(a[:",[49,1433,192],{"class":63},[49,1435,1436],{"class":59},"])   ",[49,1438,1439],{"class":73},"\u002F\u002F [1 2 3 99] — сюрприз! a \"не знает\" об этом элементе,\n",[49,1441,1442],{"class":51,"line":1271},[49,1443,1444],{"class":73},"                     \u002F\u002F но данные в памяти изменились\n",[16,1446,1447,1448,1450],{},"Чтобы избежать этого, используют трёхиндексный срез — он ограничивает ",[46,1449,573],{}," дочернего слайса:",[39,1452,1454],{"className":41,"code":1453,"language":43,"meta":44,"style":44},"a := make([]int, 3, 6) \u002F\u002F len=3, cap=6\na[0], a[1], a[2] = 1, 2, 3\n\nb := a[0:3:3] \u002F\u002F len=3, cap=3 — теперь любой append создаст новый массив\nb = append(b, 99) \u002F\u002F реаллокация — a не затронут\nfmt.Println(a) \u002F\u002F [1 2 3] — безопасно\n",[46,1455,1456,1480,1508,1512,1535,1552],{"__ignoreMap":44},[49,1457,1458,1460,1462,1464,1466,1468,1470,1472,1474,1476,1478],{"class":51,"line":52},[49,1459,222],{"class":59},[49,1461,83],{"class":55},[49,1463,974],{"class":292},[49,1465,977],{"class":59},[49,1467,70],{"class":55},[49,1469,101],{"class":59},[49,1471,64],{"class":63},[49,1473,101],{"class":59},[49,1475,601],{"class":63},[49,1477,1342],{"class":59},[49,1479,1345],{"class":73},[49,1481,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506],{"class":51,"line":77},[49,1483,1350],{"class":59},[49,1485,267],{"class":63},[49,1487,1355],{"class":59},[49,1489,98],{"class":63},[49,1491,1355],{"class":59},[49,1493,104],{"class":63},[49,1495,270],{"class":59},[49,1497,273],{"class":55},[49,1499,1368],{"class":63},[49,1501,101],{"class":59},[49,1503,104],{"class":63},[49,1505,101],{"class":59},[49,1507,1377],{"class":63},[49,1509,1510],{"class":51,"line":117},[49,1511,283],{"emptyLinePlaceholder":282},[49,1513,1514,1516,1518,1520,1522,1524,1526,1528,1530,1532],{"class":51,"line":279},[49,1515,80],{"class":59},[49,1517,83],{"class":55},[49,1519,646],{"class":59},[49,1521,267],{"class":63},[49,1523,651],{"class":59},[49,1525,64],{"class":63},[49,1527,651],{"class":59},[49,1529,64],{"class":63},[49,1531,270],{"class":59},[49,1533,1534],{"class":73},"\u002F\u002F len=3, cap=3 — теперь любой append создаст новый массив\n",[49,1536,1537,1539,1541,1543,1545,1547,1549],{"class":51,"line":286},[49,1538,80],{"class":59},[49,1540,273],{"class":55},[49,1542,1071],{"class":292},[49,1544,1409],{"class":59},[49,1546,1412],{"class":63},[49,1548,1342],{"class":59},[49,1550,1551],{"class":73},"\u002F\u002F реаллокация — a не затронут\n",[49,1553,1554,1556,1558,1560],{"class":51,"line":302},[49,1555,289],{"class":59},[49,1557,293],{"class":292},[49,1559,296],{"class":59},[49,1561,1562],{"class":73},"\u002F\u002F [1 2 3] — безопасно\n",[19,1564],{},[22,1566,1568],{"id":1567},"copy-явное-копирование-данных","copy — явное копирование данных",[16,1570,1571,1574,1575,651],{},[46,1572,1573],{},"copy"," копирует элементы из одного слайса в другой и возвращает количество скопированных элементов — ",[46,1576,1577],{},"min(len(dst), len(src))",[39,1579,1581],{"className":41,"code":1580,"language":43,"meta":44,"style":44},"src := []int{1, 2, 3, 4, 5}\ndst := make([]int, 3)\n\nn := copy(dst, src)\nfmt.Println(dst) \u002F\u002F [1 2 3] — скопировалось 3 элемента (len(dst))\nfmt.Println(n)   \u002F\u002F 3\n",[46,1582,1583,1616,1635,1639,1652,1664],{"__ignoreMap":44},[49,1584,1585,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614],{"class":51,"line":52},[49,1586,1587],{"class":59},"src ",[49,1589,83],{"class":55},[49,1591,529],{"class":59},[49,1593,70],{"class":55},[49,1595,95],{"class":59},[49,1597,98],{"class":63},[49,1599,101],{"class":59},[49,1601,104],{"class":63},[49,1603,101],{"class":59},[49,1605,64],{"class":63},[49,1607,101],{"class":59},[49,1609,192],{"class":63},[49,1611,101],{"class":59},[49,1613,626],{"class":63},[49,1615,247],{"class":59},[49,1617,1618,1621,1623,1625,1627,1629,1631,1633],{"class":51,"line":77},[49,1619,1620],{"class":59},"dst ",[49,1622,83],{"class":55},[49,1624,974],{"class":292},[49,1626,977],{"class":59},[49,1628,70],{"class":55},[49,1630,101],{"class":59},[49,1632,64],{"class":63},[49,1634,1079],{"class":59},[49,1636,1637],{"class":51,"line":117},[49,1638,283],{"emptyLinePlaceholder":282},[49,1640,1641,1644,1646,1649],{"class":51,"line":279},[49,1642,1643],{"class":59},"n ",[49,1645,83],{"class":55},[49,1647,1648],{"class":292}," copy",[49,1650,1651],{"class":59},"(dst, src)\n",[49,1653,1654,1656,1658,1661],{"class":51,"line":286},[49,1655,289],{"class":59},[49,1657,293],{"class":292},[49,1659,1660],{"class":59},"(dst) ",[49,1662,1663],{"class":73},"\u002F\u002F [1 2 3] — скопировалось 3 элемента (len(dst))\n",[49,1665,1666,1668,1670,1673],{"class":51,"line":302},[49,1667,289],{"class":59},[49,1669,293],{"class":292},[49,1671,1672],{"class":59},"(n)   ",[49,1674,1675],{"class":73},"\u002F\u002F 3\n",[16,1677,1678,1680],{},[46,1679,1573],{}," всегда безопасен: источник и получатель могут перекрываться (копирование через memmove), а не через memcpy.",[209,1682,1684],{"id":1683},"полное-клонирование-слайса","Полное клонирование слайса",[39,1686,1688],{"className":41,"code":1687,"language":43,"meta":44,"style":44},"original := []int{1, 2, 3, 4, 5}\n\n\u002F\u002F Способ 1 — через make + copy\nclone := make([]int, len(original))\ncopy(clone, original)\n\n\u002F\u002F Способ 2 — через append (идиоматично)\nclone2 := append([]int{}, original...)\nfmt.Println(clone2) \u002F\u002F [1 2 3 4 5]\n\nclone[0] = 99\nfmt.Println(original) \u002F\u002F [1 2 3 4 5] — не изменился\nfmt.Println(clone)    \u002F\u002F [99 2 3 4 5]\n",[46,1689,1690,1723,1727,1732,1752,1759,1763,1768,1788,1800,1804,1817,1829],{"__ignoreMap":44},[49,1691,1692,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721],{"class":51,"line":52},[49,1693,1694],{"class":59},"original ",[49,1696,83],{"class":55},[49,1698,529],{"class":59},[49,1700,70],{"class":55},[49,1702,95],{"class":59},[49,1704,98],{"class":63},[49,1706,101],{"class":59},[49,1708,104],{"class":63},[49,1710,101],{"class":59},[49,1712,64],{"class":63},[49,1714,101],{"class":59},[49,1716,192],{"class":63},[49,1718,101],{"class":59},[49,1720,626],{"class":63},[49,1722,247],{"class":59},[49,1724,1725],{"class":51,"line":77},[49,1726,283],{"emptyLinePlaceholder":282},[49,1728,1729],{"class":51,"line":117},[49,1730,1731],{"class":73},"\u002F\u002F Способ 1 — через make + copy\n",[49,1733,1734,1737,1739,1741,1743,1745,1747,1749],{"class":51,"line":279},[49,1735,1736],{"class":59},"clone ",[49,1738,83],{"class":55},[49,1740,974],{"class":292},[49,1742,977],{"class":59},[49,1744,70],{"class":55},[49,1746,101],{"class":59},[49,1748,556],{"class":292},[49,1750,1751],{"class":59},"(original))\n",[49,1753,1754,1756],{"class":51,"line":286},[49,1755,1573],{"class":292},[49,1757,1758],{"class":59},"(clone, original)\n",[49,1760,1761],{"class":51,"line":302},[49,1762,283],{"emptyLinePlaceholder":282},[49,1764,1765],{"class":51,"line":410},[49,1766,1767],{"class":73},"\u002F\u002F Способ 2 — через append (идиоматично)\n",[49,1769,1770,1773,1775,1777,1779,1781,1784,1786],{"class":51,"line":1271},[49,1771,1772],{"class":59},"clone2 ",[49,1774,83],{"class":55},[49,1776,1071],{"class":292},[49,1778,977],{"class":59},[49,1780,70],{"class":55},[49,1782,1783],{"class":59},"{}, original",[49,1785,127],{"class":55},[49,1787,1079],{"class":59},[49,1789,1790,1792,1794,1797],{"class":51,"line":1277},[49,1791,289],{"class":59},[49,1793,293],{"class":292},[49,1795,1796],{"class":59},"(clone2) ",[49,1798,1799],{"class":73},"\u002F\u002F [1 2 3 4 5]\n",[49,1801,1802],{"class":51,"line":1283},[49,1803,283],{"emptyLinePlaceholder":282},[49,1805,1806,1809,1811,1813,1815],{"class":51,"line":1289},[49,1807,1808],{"class":59},"clone[",[49,1810,267],{"class":63},[49,1812,270],{"class":59},[49,1814,273],{"class":55},[49,1816,276],{"class":63},[49,1818,1819,1821,1823,1826],{"class":51,"line":1295},[49,1820,289],{"class":59},[49,1822,293],{"class":292},[49,1824,1825],{"class":59},"(original) ",[49,1827,1828],{"class":73},"\u002F\u002F [1 2 3 4 5] — не изменился\n",[49,1830,1831,1833,1835,1838],{"class":51,"line":1301},[49,1832,289],{"class":59},[49,1834,293],{"class":292},[49,1836,1837],{"class":59},"(clone)    ",[49,1839,1840],{"class":73},"\u002F\u002F [99 2 3 4 5]\n",[16,1842,1843,1844,1847,1848,1850,1851,1854,1855,1857],{},"Оба способа правильны. ",[46,1845,1846],{},"append([]int{}, original...)"," чуть короче, но создаёт слайс с ",[46,1849,1114],{},". ",[46,1852,1853],{},"make + copy"," даёт больше контроля — можно задать ",[46,1856,573],{}," с запасом.",[209,1859,1861],{"id":1860},"copy-для-сдвига-элементов","copy для сдвига элементов",[16,1863,1864,1866],{},[46,1865,1573],{}," корректно обрабатывает перекрывающиеся регионы того же слайса:",[39,1868,1870],{"className":41,"code":1869,"language":43,"meta":44,"style":44},"s := []int{1, 2, 3, 4, 5}\n\n\u002F\u002F Удаление элемента с индексом 2 (значение 3)\ncopy(s[2:], s[3:]) \u002F\u002F сдвигаем элементы влево\ns = s[:len(s)-1]   \u002F\u002F уменьшаем длину\n\nfmt.Println(s) \u002F\u002F [1 2 4 5]\n",[46,1871,1872,1904,1908,1913,1933,1958,1962],{"__ignoreMap":44},[49,1873,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902],{"class":51,"line":52},[49,1875,524],{"class":59},[49,1877,83],{"class":55},[49,1879,529],{"class":59},[49,1881,70],{"class":55},[49,1883,95],{"class":59},[49,1885,98],{"class":63},[49,1887,101],{"class":59},[49,1889,104],{"class":63},[49,1891,101],{"class":59},[49,1893,64],{"class":63},[49,1895,101],{"class":59},[49,1897,192],{"class":63},[49,1899,101],{"class":59},[49,1901,626],{"class":63},[49,1903,247],{"class":59},[49,1905,1906],{"class":51,"line":77},[49,1907,283],{"emptyLinePlaceholder":282},[49,1909,1910],{"class":51,"line":117},[49,1911,1912],{"class":73},"\u002F\u002F Удаление элемента с индексом 2 (значение 3)\n",[49,1914,1915,1917,1920,1922,1925,1927,1930],{"class":51,"line":279},[49,1916,1573],{"class":292},[49,1918,1919],{"class":59},"(s[",[49,1921,104],{"class":63},[49,1923,1924],{"class":59},":], s[",[49,1926,64],{"class":63},[49,1928,1929],{"class":59},":]) ",[49,1931,1932],{"class":73},"\u002F\u002F сдвигаем элементы влево\n",[49,1934,1935,1937,1939,1942,1944,1947,1950,1952,1955],{"class":51,"line":286},[49,1936,524],{"class":59},[49,1938,273],{"class":55},[49,1940,1941],{"class":59}," s[:",[49,1943,556],{"class":292},[49,1945,1946],{"class":59},"(s)",[49,1948,1949],{"class":55},"-",[49,1951,98],{"class":63},[49,1953,1954],{"class":59},"]   ",[49,1956,1957],{"class":73},"\u002F\u002F уменьшаем длину\n",[49,1959,1960],{"class":51,"line":302},[49,1961,283],{"emptyLinePlaceholder":282},[49,1963,1964,1966,1968,1970],{"class":51,"line":410},[49,1965,289],{"class":59},[49,1967,293],{"class":292},[49,1969,1088],{"class":59},[49,1971,1972],{"class":73},"\u002F\u002F [1 2 4 5]\n",[19,1974],{},[22,1976,1978],{"id":1977},"nil-слайс-vs-пустой-слайс","nil-слайс vs пустой слайс",[16,1980,1981],{},"Эта разница маленькая, но на собеседованиях спрашивают часто:",[39,1983,1985],{"className":41,"code":1984,"language":43,"meta":44,"style":44},"var s []int           \u002F\u002F nil-слайс: Data=nil, Len=0, Cap=0\ne := []int{}          \u002F\u002F пустой слайс: Data=(непустой указатель), Len=0, Cap=0\nm := make([]int, 0)   \u002F\u002F тоже пустой слайс\n\nfmt.Println(s == nil) \u002F\u002F true\nfmt.Println(e == nil) \u002F\u002F false\nfmt.Println(m == nil) \u002F\u002F false\n\n\u002F\u002F Поведение одинаково:\nfmt.Println(len(s), len(e)) \u002F\u002F 0 0\ns = append(s, 1)            \u002F\u002F append с nil-слайсом работает нормально\n",[46,1986,1987,1999,2016,2039,2043,2063,2081,2098,2102,2107,2127],{"__ignoreMap":44},[49,1988,1989,1991,1994,1996],{"class":51,"line":52},[49,1990,56],{"class":55},[49,1992,1993],{"class":59}," s []",[49,1995,70],{"class":55},[49,1997,1998],{"class":73},"           \u002F\u002F nil-слайс: Data=nil, Len=0, Cap=0\n",[49,2000,2001,2004,2006,2008,2010,2013],{"class":51,"line":77},[49,2002,2003],{"class":59},"e ",[49,2005,83],{"class":55},[49,2007,529],{"class":59},[49,2009,70],{"class":55},[49,2011,2012],{"class":59},"{}          ",[49,2014,2015],{"class":73},"\u002F\u002F пустой слайс: Data=(непустой указатель), Len=0, Cap=0\n",[49,2017,2018,2021,2023,2025,2027,2029,2031,2033,2036],{"class":51,"line":117},[49,2019,2020],{"class":59},"m ",[49,2022,83],{"class":55},[49,2024,974],{"class":292},[49,2026,977],{"class":59},[49,2028,70],{"class":55},[49,2030,101],{"class":59},[49,2032,267],{"class":63},[49,2034,2035],{"class":59},")   ",[49,2037,2038],{"class":73},"\u002F\u002F тоже пустой слайс\n",[49,2040,2041],{"class":51,"line":279},[49,2042,283],{"emptyLinePlaceholder":282},[49,2044,2045,2047,2049,2052,2055,2058,2060],{"class":51,"line":286},[49,2046,289],{"class":59},[49,2048,293],{"class":292},[49,2050,2051],{"class":59},"(s ",[49,2053,2054],{"class":55},"==",[49,2056,2057],{"class":63}," nil",[49,2059,1342],{"class":59},[49,2061,2062],{"class":73},"\u002F\u002F true\n",[49,2064,2065,2067,2069,2072,2074,2076,2078],{"class":51,"line":302},[49,2066,289],{"class":59},[49,2068,293],{"class":292},[49,2070,2071],{"class":59},"(e ",[49,2073,2054],{"class":55},[49,2075,2057],{"class":63},[49,2077,1342],{"class":59},[49,2079,2080],{"class":73},"\u002F\u002F false\n",[49,2082,2083,2085,2087,2090,2092,2094,2096],{"class":51,"line":410},[49,2084,289],{"class":59},[49,2086,293],{"class":292},[49,2088,2089],{"class":59},"(m ",[49,2091,2054],{"class":55},[49,2093,2057],{"class":63},[49,2095,1342],{"class":59},[49,2097,2080],{"class":73},[49,2099,2100],{"class":51,"line":1271},[49,2101,283],{"emptyLinePlaceholder":282},[49,2103,2104],{"class":51,"line":1277},[49,2105,2106],{"class":73},"\u002F\u002F Поведение одинаково:\n",[49,2108,2109,2111,2113,2115,2117,2119,2121,2124],{"class":51,"line":1283},[49,2110,289],{"class":59},[49,2112,293],{"class":292},[49,2114,331],{"class":59},[49,2116,556],{"class":292},[49,2118,1249],{"class":59},[49,2120,556],{"class":292},[49,2122,2123],{"class":59},"(e)) ",[49,2125,2126],{"class":73},"\u002F\u002F 0 0\n",[49,2128,2129,2131,2133,2135,2137,2139,2142],{"class":51,"line":1289},[49,2130,524],{"class":59},[49,2132,273],{"class":55},[49,2134,1071],{"class":292},[49,2136,1074],{"class":59},[49,2138,98],{"class":63},[49,2140,2141],{"class":59},")            ",[49,2143,2144],{"class":73},"\u002F\u002F append с nil-слайсом работает нормально\n",[16,2146,2147],{},"Практически важный момент: при JSON-сериализации они ведут себя по-разному.",[39,2149,2151],{"className":41,"code":2150,"language":43,"meta":44,"style":44},"import \"encoding\u002Fjson\"\n\nvar s []int     \u002F\u002F nil\ne := []int{}    \u002F\u002F пустой\n\njs, _ := json.Marshal(s) \u002F\u002F null\nje, _ := json.Marshal(e) \u002F\u002F []\n",[46,2152,2153,2167,2171,2182,2198,2202,2220],{"__ignoreMap":44},[49,2154,2155,2158,2161,2164],{"class":51,"line":52},[49,2156,2157],{"class":55},"import",[49,2159,2160],{"class":1229}," \"",[49,2162,2163],{"class":292},"encoding\u002Fjson",[49,2165,2166],{"class":1229},"\"\n",[49,2168,2169],{"class":51,"line":77},[49,2170,283],{"emptyLinePlaceholder":282},[49,2172,2173,2175,2177,2179],{"class":51,"line":117},[49,2174,56],{"class":55},[49,2176,1993],{"class":59},[49,2178,70],{"class":55},[49,2180,2181],{"class":73},"     \u002F\u002F nil\n",[49,2183,2184,2186,2188,2190,2192,2195],{"class":51,"line":279},[49,2185,2003],{"class":59},[49,2187,83],{"class":55},[49,2189,529],{"class":59},[49,2191,70],{"class":55},[49,2193,2194],{"class":59},"{}    ",[49,2196,2197],{"class":73},"\u002F\u002F пустой\n",[49,2199,2200],{"class":51,"line":286},[49,2201,283],{"emptyLinePlaceholder":282},[49,2203,2204,2207,2209,2212,2215,2217],{"class":51,"line":302},[49,2205,2206],{"class":59},"js, _ ",[49,2208,83],{"class":55},[49,2210,2211],{"class":59}," json.",[49,2213,2214],{"class":292},"Marshal",[49,2216,1088],{"class":59},[49,2218,2219],{"class":73},"\u002F\u002F null\n",[49,2221,2222,2225,2227,2229,2231,2234],{"class":51,"line":410},[49,2223,2224],{"class":59},"je, _ ",[49,2226,83],{"class":55},[49,2228,2211],{"class":59},[49,2230,2214],{"class":292},[49,2232,2233],{"class":59},"(e) ",[49,2235,2236],{"class":73},"\u002F\u002F []\n",[16,2238,2239,2240,2243,2244,2247,2248,2251,2252,37],{},"Если API должен возвращать пустой массив ",[46,2241,2242],{},"[]",", а не ",[46,2245,2246],{},"null"," — используйте ",[46,2249,2250],{},"make([]int, 0)"," или ",[46,2253,2254],{},"[]int{}",[19,2256],{},[22,2258,2260],{"id":2259},"производительность-когда-что-использовать","Производительность: когда что использовать",[16,2262,2263],{},"Понимание внутреннего устройства слайса позволяет принимать осознанные решения:",[16,2265,2266,2269],{},[30,2267,2268],{},"Предаллоцируйте, если знаете размер."," Каждая реаллокация — это аллокация памяти + копирование всех данных:",[39,2271,2273],{"className":41,"code":2272,"language":43,"meta":44,"style":44},"\u002F\u002F Плохо — N реаллокаций\nresult := []int{}\nfor i := 0; i \u003C 10000; i++ {\n    result = append(result, i)\n}\n\n\u002F\u002F Хорошо — 0 реаллокаций\nresult := make([]int, 0, 10000)\nfor i := 0; i \u003C 10000; i++ {\n    result = append(result, i)\n}\n",[46,2274,2275,2280,2294,2317,2329,2333,2337,2342,2365,2387,2397],{"__ignoreMap":44},[49,2276,2277],{"class":51,"line":52},[49,2278,2279],{"class":73},"\u002F\u002F Плохо — N реаллокаций\n",[49,2281,2282,2285,2287,2289,2291],{"class":51,"line":77},[49,2283,2284],{"class":59},"result ",[49,2286,83],{"class":55},[49,2288,529],{"class":59},[49,2290,70],{"class":55},[49,2292,2293],{"class":59},"{}\n",[49,2295,2296,2298,2300,2302,2304,2306,2308,2311,2313,2315],{"class":51,"line":117},[49,2297,1179],{"class":55},[49,2299,1182],{"class":59},[49,2301,83],{"class":55},[49,2303,1187],{"class":63},[49,2305,1190],{"class":59},[49,2307,1193],{"class":55},[49,2309,2310],{"class":63}," 10000",[49,2312,1199],{"class":59},[49,2314,1202],{"class":55},[49,2316,458],{"class":59},[49,2318,2319,2322,2324,2326],{"class":51,"line":279},[49,2320,2321],{"class":59},"    result ",[49,2323,273],{"class":55},[49,2325,1071],{"class":292},[49,2327,2328],{"class":59},"(result, i)\n",[49,2330,2331],{"class":51,"line":286},[49,2332,247],{"class":59},[49,2334,2335],{"class":51,"line":302},[49,2336,283],{"emptyLinePlaceholder":282},[49,2338,2339],{"class":51,"line":410},[49,2340,2341],{"class":73},"\u002F\u002F Хорошо — 0 реаллокаций\n",[49,2343,2344,2346,2348,2350,2352,2354,2356,2358,2360,2363],{"class":51,"line":1271},[49,2345,2284],{"class":59},[49,2347,83],{"class":55},[49,2349,974],{"class":292},[49,2351,977],{"class":59},[49,2353,70],{"class":55},[49,2355,101],{"class":59},[49,2357,267],{"class":63},[49,2359,101],{"class":59},[49,2361,2362],{"class":63},"10000",[49,2364,1079],{"class":59},[49,2366,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385],{"class":51,"line":1277},[49,2368,1179],{"class":55},[49,2370,1182],{"class":59},[49,2372,83],{"class":55},[49,2374,1187],{"class":63},[49,2376,1190],{"class":59},[49,2378,1193],{"class":55},[49,2380,2310],{"class":63},[49,2382,1199],{"class":59},[49,2384,1202],{"class":55},[49,2386,458],{"class":59},[49,2388,2389,2391,2393,2395],{"class":51,"line":1283},[49,2390,2321],{"class":59},[49,2392,273],{"class":55},[49,2394,1071],{"class":292},[49,2396,2328],{"class":59},[49,2398,2399],{"class":51,"line":1289},[49,2400,247],{"class":59},[16,2402,2403,2406],{},[30,2404,2405],{},"Помните об утечках памяти через слайсы."," Если вы держите маленький слайс, который ссылается на большой underlying array — весь массив остаётся в памяти:",[39,2408,2410],{"className":41,"code":2409,"language":43,"meta":44,"style":44},"func getFirstTwo(data []int) []int {\n    return data[:2] \u002F\u002F ссылается на весь data, даже если data огромный\n}\n\n\u002F\u002F Правильно — копируем только нужное\nfunc getFirstTwo(data []int) []int {\n    result := make([]int, 2)\n    copy(result, data[:2])\n    return result\n}\n",[46,2411,2412,2435,2450,2454,2458,2463,2483,2501,2514,2521],{"__ignoreMap":44},[49,2413,2414,2416,2419,2421,2424,2426,2428,2431,2433],{"class":51,"line":52},[49,2415,325],{"class":55},[49,2417,2418],{"class":292}," getFirstTwo",[49,2420,331],{"class":59},[49,2422,2423],{"class":334},"data",[49,2425,529],{"class":59},[49,2427,70],{"class":55},[49,2429,2430],{"class":59},") []",[49,2432,70],{"class":55},[49,2434,458],{"class":59},[49,2436,2437,2440,2443,2445,2447],{"class":51,"line":77},[49,2438,2439],{"class":55},"    return",[49,2441,2442],{"class":59}," data[:",[49,2444,104],{"class":63},[49,2446,270],{"class":59},[49,2448,2449],{"class":73},"\u002F\u002F ссылается на весь data, даже если data огромный\n",[49,2451,2452],{"class":51,"line":117},[49,2453,247],{"class":59},[49,2455,2456],{"class":51,"line":279},[49,2457,283],{"emptyLinePlaceholder":282},[49,2459,2460],{"class":51,"line":286},[49,2461,2462],{"class":73},"\u002F\u002F Правильно — копируем только нужное\n",[49,2464,2465,2467,2469,2471,2473,2475,2477,2479,2481],{"class":51,"line":302},[49,2466,325],{"class":55},[49,2468,2418],{"class":292},[49,2470,331],{"class":59},[49,2472,2423],{"class":334},[49,2474,529],{"class":59},[49,2476,70],{"class":55},[49,2478,2430],{"class":59},[49,2480,70],{"class":55},[49,2482,458],{"class":59},[49,2484,2485,2487,2489,2491,2493,2495,2497,2499],{"class":51,"line":410},[49,2486,2321],{"class":59},[49,2488,83],{"class":55},[49,2490,974],{"class":292},[49,2492,977],{"class":59},[49,2494,70],{"class":55},[49,2496,101],{"class":59},[49,2498,104],{"class":63},[49,2500,1079],{"class":59},[49,2502,2503,2506,2509,2511],{"class":51,"line":1271},[49,2504,2505],{"class":292},"    copy",[49,2507,2508],{"class":59},"(result, data[:",[49,2510,104],{"class":63},[49,2512,2513],{"class":59},"])\n",[49,2515,2516,2518],{"class":51,"line":1277},[49,2517,2439],{"class":55},[49,2519,2520],{"class":59}," result\n",[49,2522,2523],{"class":51,"line":1283},[49,2524,247],{"class":59},[19,2526],{},[22,2528,2530],{"id":2529},"вопросы-на-собеседовании","Вопросы на собеседовании",[16,2532,2533,2536,2539,2540,2542,2543,2545,2546,101,2548,101,2550,2552],{},[30,2534,2535],{},"Q: Чем массив отличается от слайса в Go?",[2537,2538],"br",{},"\nA: Массив — значимый тип с фиксированным размером, который является частью типа (",[46,2541,155],{}," ≠ ",[46,2544,159],{},"). При присвоении копируется целиком. Слайс — дескриптор (заголовок из трёх полей: ",[46,2547,1103],{},[46,2549,832],{},[46,2551,836],{},"), который ссылается на underlying array. При присвоении копируется только заголовок.",[16,2554,2555,2558,2560,2561,2563,2564,2566,2567,2569,2570,2572],{},[30,2556,2557],{},"Q: Из чего состоит слайс внутри?",[2537,2559],{},"\nA: Из трёх полей: ",[46,2562,1103],{}," — указатель на первый элемент в underlying array, ",[46,2565,832],{}," — текущее количество элементов, ",[46,2568,836],{}," — ёмкость от ",[46,2571,1103],{}," до конца underlying array. На 64-битной системе заголовок занимает 24 байта.",[16,2574,2575,2583,2585,2586,2588,2589,2591,2592,37],{},[30,2576,2577,2578,156,2580,2582],{},"Q: Что такое ",[46,2579,556],{},[46,2581,573],{},"? В чём разница?",[2537,2584],{},"\nA: ",[46,2587,556],{}," — количество элементов, доступных через слайс прямо сейчас. ",[46,2590,573],{}," — сколько элементов можно взять без новой аллокации, расширив слайс до конца underlying array. Всегда ",[46,2593,2594],{},"len \u003C= cap",[16,2596,2597,2606,2608,2609,101,2611,156,2613,2615],{},[30,2598,2599,2600,2602,2603,2605],{},"Q: Что делает ",[46,2601,1022],{},", если ",[46,2604,1114],{},"?",[2537,2607],{},"\nA: Выделяет новый underlying array большего размера (с запасом по стратегии Go runtime), копирует все существующие данные, добавляет новый элемент и возвращает слайс с новым ",[46,2610,1103],{},[46,2612,832],{},[46,2614,836],{},". Старый underlying array становится кандидатом для GC.",[16,2617,2618,2621,2623,2624,101,2627,2630,2631,2633],{},[30,2619,2620],{},"Q: Могут ли два слайса ссылаться на один underlying array? К чему это приводит?",[2537,2622],{},"\nA: Да. Срезы (",[46,2625,2626],{},"a[1:3]",[46,2628,2629],{},"a[2:5]",") создают новые заголовки, но смотрят в тот же массив. Изменение через один слайс видно через другой. Это частый источник неочевидных багов при ",[46,2632,1022],{}," без реаллокации.",[16,2635,2636,2642,2644,2645,2647,2648,2650],{},[30,2637,2638,2639,2641],{},"Q: Почему результат ",[46,2640,1022],{}," нужно обязательно присваивать обратно?",[2537,2643],{},"\nA: Потому что ",[46,2646,1022],{}," может вернуть слайс с новым ",[46,2649,1103],{}," (если произошла реаллокация). Если игнорировать возвращаемое значение и работать со старым заголовком, вы потеряете добавленные элементы.",[16,2652,2653,2660,2585,2662,2664,2665,2668,2669,2672,2673,2675,2676,2678,2679,2682,2683,101,2685,156,2687,2689,2690,2693,2694,2696,2697,2699],{},[30,2654,2655,2656,2659],{},"Q: Чем ",[46,2657,2658],{},"nil","-слайс отличается от пустого слайса?",[2537,2661],{},[46,2663,2658],{},"-слайс (",[46,2666,2667],{},"var s []int",") имеет ",[46,2670,2671],{},"Data=nil, Len=0, Cap=0",". Пустой слайс (",[46,2674,2254],{},") имеет ненулевой ",[46,2677,1103],{},", но ",[46,2680,2681],{},"Len=0, Cap=0",". Поведение идентично для ",[46,2684,556],{},[46,2686,573],{},[46,2688,1022],{},". Разница проявляется при ",[46,2691,2692],{},"== nil"," (true vs false) и JSON-сериализации (",[46,2695,2246],{}," vs ",[46,2698,2242],{},").",[16,2701,2702,2713,2715,2716,2719,2720,2723,2724,2726,2727,2729,2730,2732,2733,37],{},[30,2703,2599,2704,2706,2707,2602,2710,2605],{},[46,2705,1573],{},"? Что вернёт ",[46,2708,2709],{},"copy(dst, src)",[46,2711,2712],{},"len(dst) != len(src)",[2537,2714],{},"\nA: Копирует элементы из ",[46,2717,2718],{},"src"," в ",[46,2721,2722],{},"dst",". Возвращает ",[46,2725,1577],{}," — количество скопированных элементов. Если ",[46,2728,2722],{}," меньше — копируется столько, сколько влезает. Если ",[46,2731,2718],{}," меньше — копируется весь ",[46,2734,2718],{},[16,2736,2737,2740,2742,2743,2745,2746,2749,2750,2753,2754,2757],{},[30,2738,2739],{},"Q: Как безопасно скопировать слайс?",[2537,2741],{},"\nA: Через ",[46,2744,1853],{},": ",[46,2747,2748],{},"dst := make([]int, len(src)); copy(dst, src)",". Или идиоматично: ",[46,2751,2752],{},"dst := append([]int{}, src...)",". Простое присвоение ",[46,2755,2756],{},"dst := src"," копирует только заголовок — оба слайса смотрят в один массив.",[16,2759,2760,2767,2769,2770,2772,2773,2776,2777,2779,2780,37],{},[30,2761,2762,2763,2766],{},"Q: Что такое трёхиндексный срез ",[46,2764,2765],{},"a[low:high:max]"," и зачем он нужен?",[2537,2768],{},"\nA: Позволяет явно ограничить ",[46,2771,573],{}," нового слайса значением ",[46,2774,2775],{},"max - low",". Это защищает от случайной записи через ",[46,2778,1022],{}," в элементы родительского слайса за пределами ",[46,2781,2782],{},"high",[16,2784,2785,2788,2790,2791,2793,2794,37],{},[30,2786,2787],{},"Q: Как слайс может стать причиной утечки памяти?",[2537,2789],{},"\nA: Если маленький слайс — срез большого — живёт долго, весь underlying array остаётся в памяти, потому что GC видит ссылку через ",[46,2792,1103],{},". Решение: скопировать нужные элементы в новый независимый слайс через ",[46,2795,1573],{},[16,2797,2798,2801,2803,2804,2807,2808,2811,2812,2815],{},[30,2799,2800],{},"Q: Как удалить элемент из слайса по индексу?",[2537,2802],{},"\nA: Два способа. С сохранением порядка: ",[46,2805,2806],{},"s = append(s[:i], s[i+1:]...)"," — сдвигает все элементы после ",[46,2809,2810],{},"i"," влево, O(n). Без сохранения порядка: ",[46,2813,2814],{},"s[i] = s[len(s)-1]; s = s[:len(s)-1]"," — заменяет удаляемый элемент последним, O(1).",[16,2817,2818,2825,2827,2828,2830,2831,2833,2834,2836],{},[30,2819,2820,2821,2824],{},"Q: Почему предаллокация через ",[46,2822,2823],{},"make([]T, 0, n)"," повышает производительность?",[2537,2826],{},"\nA: Без неё каждая реаллокация при ",[46,2829,1022],{}," — это аллокация новой памяти и копирование всех данных. При известном размере результата ",[46,2832,2823],{}," резервирует нужную память заранее, и ",[46,2835,1022],{}," никогда не будет реаллоцировать.",[19,2838],{},[22,2840,2842],{"id":2841},"практика","Практика",[2844,2845,2847,2850,2929,2944],"quiz",{"answer":64,"id":2846,"xp":1010},"basics-slices-q1",[16,2848,2849],{},"Что выведет код?",[39,2851,2853],{"className":41,"code":2852,"language":43,"meta":44,"style":44},"a := []int{1, 2, 3, 4, 5}\nb := a[1:3]\nb[0] = 99\nfmt.Println(a[1])\n",[46,2854,2855,2887,2904,2916],{"__ignoreMap":44},[49,2856,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879,2881,2883,2885],{"class":51,"line":52},[49,2858,222],{"class":59},[49,2860,83],{"class":55},[49,2862,529],{"class":59},[49,2864,70],{"class":55},[49,2866,95],{"class":59},[49,2868,98],{"class":63},[49,2870,101],{"class":59},[49,2872,104],{"class":63},[49,2874,101],{"class":59},[49,2876,64],{"class":63},[49,2878,101],{"class":59},[49,2880,192],{"class":63},[49,2882,101],{"class":59},[49,2884,626],{"class":63},[49,2886,247],{"class":59},[49,2888,2889,2891,2893,2895,2897,2899,2901],{"class":51,"line":77},[49,2890,80],{"class":59},[49,2892,83],{"class":55},[49,2894,646],{"class":59},[49,2896,98],{"class":63},[49,2898,651],{"class":59},[49,2900,64],{"class":63},[49,2902,2903],{"class":59},"]\n",[49,2905,2906,2908,2910,2912,2914],{"class":51,"line":117},[49,2907,264],{"class":59},[49,2909,267],{"class":63},[49,2911,270],{"class":59},[49,2913,273],{"class":55},[49,2915,276],{"class":63},[49,2917,2918,2920,2922,2925,2927],{"class":51,"line":279},[49,2919,289],{"class":59},[49,2921,293],{"class":292},[49,2923,2924],{"class":59},"(a[",[49,2926,98],{"class":63},[49,2928,2513],{"class":59},[2930,2931,2932],"template",{"v-slot:options":44},[2933,2934,2935,2937,2939,2941],"ul",{},[1123,2936,98],{},[1123,2938,104],{},[1123,2940,1412],{},[1123,2942,2943],{},"panic",[2930,2945,2946],{"v-slot:explanation":44},[16,2947,2948,2951,2952,2955,2956,1850,2958,160,2961,2964,2965,2968,2969,2971],{},[46,2949,2950],{},"b := a[1:3]"," создаёт срез, который смотрит в ",[30,2953,2954],{},"тот же"," underlying array, что и ",[46,2957,695],{},[46,2959,2960],{},"b[0]",[46,2962,2963],{},"a[1]",". Запись ",[46,2966,2967],{},"b[0] = 99"," меняет ",[46,2970,2963],{},". Оба слайса разделяют данные.",[2973,2974,2978,2981,3114],"predict",{"answer":2975,"id":2976,"xp":2977},"[1 2 3]\\n3\\n6","basics-slices-p1","15",[16,2979,2980],{},"Угадай вывод программы.",[2930,2982,2983],{"v-slot:code":44},[39,2984,2986],{"className":41,"code":2985,"language":43,"meta":44,"style":44},"package main\n\nimport \"fmt\"\n\nfunc main() {\n    s := make([]int, 3, 6)\n    s[0], s[1], s[2] = 1, 2, 3\n    fmt.Println(s)\n    fmt.Println(len(s))\n    fmt.Println(cap(s))\n}\n",[46,2987,2988,2996,3000,3011,3015,3025,3047,3077,3086,3098,3110],{"__ignoreMap":44},[49,2989,2990,2993],{"class":51,"line":52},[49,2991,2992],{"class":55},"package",[49,2994,2995],{"class":292}," main\n",[49,2997,2998],{"class":51,"line":77},[49,2999,283],{"emptyLinePlaceholder":282},[49,3001,3002,3004,3006,3009],{"class":51,"line":117},[49,3003,2157],{"class":55},[49,3005,2160],{"class":1229},[49,3007,3008],{"class":292},"fmt",[49,3010,2166],{"class":1229},[49,3012,3013],{"class":51,"line":279},[49,3014,283],{"emptyLinePlaceholder":282},[49,3016,3017,3019,3022],{"class":51,"line":286},[49,3018,325],{"class":55},[49,3020,3021],{"class":292}," main",[49,3023,3024],{"class":59},"() {\n",[49,3026,3027,3029,3031,3033,3035,3037,3039,3041,3043,3045],{"class":51,"line":302},[49,3028,1209],{"class":59},[49,3030,83],{"class":55},[49,3032,974],{"class":292},[49,3034,977],{"class":59},[49,3036,70],{"class":55},[49,3038,101],{"class":59},[49,3040,64],{"class":63},[49,3042,101],{"class":59},[49,3044,601],{"class":63},[49,3046,1079],{"class":59},[49,3048,3049,3052,3054,3057,3059,3061,3063,3065,3067,3069,3071,3073,3075],{"class":51,"line":410},[49,3050,3051],{"class":59},"    s[",[49,3053,267],{"class":63},[49,3055,3056],{"class":59},"], s[",[49,3058,98],{"class":63},[49,3060,3056],{"class":59},[49,3062,104],{"class":63},[49,3064,270],{"class":59},[49,3066,273],{"class":55},[49,3068,1368],{"class":63},[49,3070,101],{"class":59},[49,3072,104],{"class":63},[49,3074,101],{"class":59},[49,3076,1377],{"class":63},[49,3078,3079,3081,3083],{"class":51,"line":1271},[49,3080,1221],{"class":59},[49,3082,293],{"class":292},[49,3084,3085],{"class":59},"(s)\n",[49,3087,3088,3090,3092,3094,3096],{"class":51,"line":1277},[49,3089,1221],{"class":59},[49,3091,293],{"class":292},[49,3093,331],{"class":59},[49,3095,556],{"class":292},[49,3097,1254],{"class":59},[49,3099,3100,3102,3104,3106,3108],{"class":51,"line":1283},[49,3101,1221],{"class":59},[49,3103,293],{"class":292},[49,3105,331],{"class":59},[49,3107,573],{"class":292},[49,3109,1254],{"class":59},[49,3111,3112],{"class":51,"line":1289},[49,3113,247],{"class":59},[2930,3115,3116],{"v-slot:hint":44},[16,3117,3118,3121,3122,156,3124,3126],{},[46,3119,3120],{},"make([]int, 3, 6)"," создаёт слайс с длиной 3 и ёмкостью 6. ",[46,3123,556],{},[46,3125,573],{}," — разные вещи.",[3128,3129,3133,3148,3298],"code-task",{"expected":3130,"id":3131,"xp":3132},"[1 2 3 4 5]\\n[5 4 3 2 1]","basics-slices-ct1","20",[16,3134,3135,3136,3139,3140,3143,3144,3147],{},"Напиши функцию ",[46,3137,3138],{},"reverse",", которая принимает ",[46,3141,3142],{},"[]int"," и возвращает ",[30,3145,3146],{},"новый"," слайс с элементами в обратном порядке. Исходный слайс не изменяй.",[2930,3149,3150],{"v-slot:template":44},[39,3151,3153],{"className":41,"code":3152,"language":43,"meta":44,"style":44},"package main\n\nimport \"fmt\"\n\nfunc reverse(s []int) []int {\n    \u002F\u002F твой код здесь\n    return nil \u002F\u002F TODO\n}\n\nfunc main() {\n    original := []int{1, 2, 3, 4, 5}\n    rev := reverse(original)\n    fmt.Println(original)\n    fmt.Println(rev)\n}\n",[46,3154,3155,3161,3165,3175,3179,3200,3205,3214,3218,3222,3230,3263,3275,3283,3293],{"__ignoreMap":44},[49,3156,3157,3159],{"class":51,"line":52},[49,3158,2992],{"class":55},[49,3160,2995],{"class":292},[49,3162,3163],{"class":51,"line":77},[49,3164,283],{"emptyLinePlaceholder":282},[49,3166,3167,3169,3171,3173],{"class":51,"line":117},[49,3168,2157],{"class":55},[49,3170,2160],{"class":1229},[49,3172,3008],{"class":292},[49,3174,2166],{"class":1229},[49,3176,3177],{"class":51,"line":279},[49,3178,283],{"emptyLinePlaceholder":282},[49,3180,3181,3183,3186,3188,3190,3192,3194,3196,3198],{"class":51,"line":286},[49,3182,325],{"class":55},[49,3184,3185],{"class":292}," reverse",[49,3187,331],{"class":59},[49,3189,507],{"class":334},[49,3191,529],{"class":59},[49,3193,70],{"class":55},[49,3195,2430],{"class":59},[49,3197,70],{"class":55},[49,3199,458],{"class":59},[49,3201,3202],{"class":51,"line":302},[49,3203,3204],{"class":73},"    \u002F\u002F твой код здесь\n",[49,3206,3207,3209,3211],{"class":51,"line":410},[49,3208,2439],{"class":55},[49,3210,2057],{"class":63},[49,3212,3213],{"class":73}," \u002F\u002F TODO\n",[49,3215,3216],{"class":51,"line":1271},[49,3217,247],{"class":59},[49,3219,3220],{"class":51,"line":1277},[49,3221,283],{"emptyLinePlaceholder":282},[49,3223,3224,3226,3228],{"class":51,"line":1283},[49,3225,325],{"class":55},[49,3227,3021],{"class":292},[49,3229,3024],{"class":59},[49,3231,3232,3235,3237,3239,3241,3243,3245,3247,3249,3251,3253,3255,3257,3259,3261],{"class":51,"line":1289},[49,3233,3234],{"class":59},"    original ",[49,3236,83],{"class":55},[49,3238,529],{"class":59},[49,3240,70],{"class":55},[49,3242,95],{"class":59},[49,3244,98],{"class":63},[49,3246,101],{"class":59},[49,3248,104],{"class":63},[49,3250,101],{"class":59},[49,3252,64],{"class":63},[49,3254,101],{"class":59},[49,3256,192],{"class":63},[49,3258,101],{"class":59},[49,3260,626],{"class":63},[49,3262,247],{"class":59},[49,3264,3265,3268,3270,3272],{"class":51,"line":1295},[49,3266,3267],{"class":59},"    rev ",[49,3269,83],{"class":55},[49,3271,3185],{"class":292},[49,3273,3274],{"class":59},"(original)\n",[49,3276,3277,3279,3281],{"class":51,"line":1301},[49,3278,1221],{"class":59},[49,3280,293],{"class":292},[49,3282,3274],{"class":59},[49,3284,3286,3288,3290],{"class":51,"line":3285},14,[49,3287,1221],{"class":59},[49,3289,293],{"class":292},[49,3291,3292],{"class":59},"(rev)\n",[49,3294,3296],{"class":51,"line":3295},15,[49,3297,247],{"class":59},[2930,3299,3300],{"v-slot:hints":44},[2933,3301,3302,3308],{},[1123,3303,3304,3305],{},"Создай новый слайс через ",[46,3306,3307],{},"make([]int, len(s))",[1123,3309,3310,3311],{},"Итерируй исходный и записывай в конец нового: ",[46,3312,3313],{},"result[len(s)-1-i] = v",[3315,3316,3320,3342,3485],"code-fix",{"expected":3317,"id":3318,"xp":3319},"[1 2 3 4 5 6]\\n[1 2 3 99]","basics-slices-cf1","25",[16,3321,3322,3323,3325,3326,3329,3330,3332,3333,3335,3336,3338,3339,37],{},"Исправь код: ",[46,3324,1022],{}," к ",[46,3327,3328],{},"b"," не должен влиять на ",[46,3331,695],{},". Сейчас ",[46,3334,3328],{}," смотрит в тот же underlying array и при ",[46,3337,1022],{}," перезаписывает ",[46,3340,3341],{},"a[3]",[2930,3343,3344],{"v-slot:code":44},[39,3345,3347],{"className":41,"code":3346,"language":43,"meta":44,"style":44},"package main\n\nimport \"fmt\"\n\nfunc main() {\n    a := []int{1, 2, 3, 4, 5, 6}\n    b := a[:3] \u002F\u002F len=3, cap=6 — смотрит в тот же массив!\n\n    b = append(b, 99) \u002F\u002F cap есть — реаллокации нет, пишет в a[3]\n\n    fmt.Println(a) \u002F\u002F должно быть [1 2 3 4 5 6], но a[3] уже 99\n    fmt.Println(b) \u002F\u002F [1 2 3 99]\n}\n",[46,3348,3349,3355,3359,3369,3373,3381,3418,3434,3438,3455,3459,3470,3481],{"__ignoreMap":44},[49,3350,3351,3353],{"class":51,"line":52},[49,3352,2992],{"class":55},[49,3354,2995],{"class":292},[49,3356,3357],{"class":51,"line":77},[49,3358,283],{"emptyLinePlaceholder":282},[49,3360,3361,3363,3365,3367],{"class":51,"line":117},[49,3362,2157],{"class":55},[49,3364,2160],{"class":1229},[49,3366,3008],{"class":292},[49,3368,2166],{"class":1229},[49,3370,3371],{"class":51,"line":279},[49,3372,283],{"emptyLinePlaceholder":282},[49,3374,3375,3377,3379],{"class":51,"line":286},[49,3376,325],{"class":55},[49,3378,3021],{"class":292},[49,3380,3024],{"class":59},[49,3382,3383,3386,3388,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408,3410,3412,3414,3416],{"class":51,"line":302},[49,3384,3385],{"class":59},"    a ",[49,3387,83],{"class":55},[49,3389,529],{"class":59},[49,3391,70],{"class":55},[49,3393,95],{"class":59},[49,3395,98],{"class":63},[49,3397,101],{"class":59},[49,3399,104],{"class":63},[49,3401,101],{"class":59},[49,3403,64],{"class":63},[49,3405,101],{"class":59},[49,3407,192],{"class":63},[49,3409,101],{"class":59},[49,3411,626],{"class":63},[49,3413,101],{"class":59},[49,3415,601],{"class":63},[49,3417,247],{"class":59},[49,3419,3420,3423,3425,3427,3429,3431],{"class":51,"line":410},[49,3421,3422],{"class":59},"    b ",[49,3424,83],{"class":55},[49,3426,1390],{"class":59},[49,3428,64],{"class":63},[49,3430,270],{"class":59},[49,3432,3433],{"class":73},"\u002F\u002F len=3, cap=6 — смотрит в тот же массив!\n",[49,3435,3436],{"class":51,"line":1271},[49,3437,283],{"emptyLinePlaceholder":282},[49,3439,3440,3442,3444,3446,3448,3450,3452],{"class":51,"line":1277},[49,3441,3422],{"class":59},[49,3443,273],{"class":55},[49,3445,1071],{"class":292},[49,3447,1409],{"class":59},[49,3449,1412],{"class":63},[49,3451,1342],{"class":59},[49,3453,3454],{"class":73},"\u002F\u002F cap есть — реаллокации нет, пишет в a[3]\n",[49,3456,3457],{"class":51,"line":1283},[49,3458,283],{"emptyLinePlaceholder":282},[49,3460,3461,3463,3465,3467],{"class":51,"line":1289},[49,3462,1221],{"class":59},[49,3464,293],{"class":292},[49,3466,296],{"class":59},[49,3468,3469],{"class":73},"\u002F\u002F должно быть [1 2 3 4 5 6], но a[3] уже 99\n",[49,3471,3472,3474,3476,3478],{"class":51,"line":1295},[49,3473,1221],{"class":59},[49,3475,293],{"class":292},[49,3477,309],{"class":59},[49,3479,3480],{"class":73},"\u002F\u002F [1 2 3 99]\n",[49,3482,3483],{"class":51,"line":1301},[49,3484,247],{"class":59},[2930,3486,3487],{"v-slot:hints":44},[2933,3488,3489,3501,3508],{},[1123,3490,3491,3494,3495,3497,3498,3500],{},[46,3492,3493],{},"b := a[:3]"," наследует cap=6 — ",[46,3496,1022],{}," пишет в a",[49,3499,64],{}," без создания нового массива",[1123,3502,3503,3504,3507],{},"Ограничь cap: ",[46,3505,3506],{},"b := a[0:3:3]"," — трёхиндексный срез, cap=3",[1123,3509,3510,3511,3514,3515,3517],{},"После этого ",[46,3512,3513],{},"append(b, 99)"," будет вынужден создать новый массив — ",[46,3516,695],{}," не изменится",[19,3519],{},[11,3521,3523],{"id":3522},"задачи-массив-и-слайс","Задачи: Массив и слайс",[19,3525],{},[16,3527,3528],{},[30,3529,3530],{},"Задача 1: Разворот слайса",[16,3532,3533,3536],{},[30,3534,3535],{},"Уровень:"," Лёгкая",[16,3538,3539,3542],{},[30,3540,3541],{},"Что проверяет:"," базовая работа со слайсами, индексация",[16,3544,3545,3548,3549,3552],{},[30,3546,3547],{},"Условие:"," Напиши функцию ",[46,3550,3551],{},"reverse(s []int) []int"," которая возвращает новый слайс с элементами в обратном порядке. Исходный слайс изменять нельзя.",[16,3554,3555],{},[30,3556,3557],{},"Примеры:",[39,3559,3564],{"className":3560,"code":3562,"language":3563},[3561],"language-text","reverse([]int{1, 2, 3, 4, 5}) → [5 4 3 2 1]\nreverse([]int{1})             → [1]\nreverse([]int{})              → []\n","text",[46,3565,3562],{"__ignoreMap":44},[16,3567,3568],{},[30,3569,3570],{},"Решение:",[39,3572,3574],{"className":41,"code":3573,"language":43,"meta":44,"style":44},"package main\n\nimport \"fmt\"\n\nfunc reverse(s []int) []int {\n    result := make([]int, len(s))\n    for i, v := range s {\n        result[len(s)-1-i] = v\n    }\n    return result\n}\n\nfunc main() {\n    fmt.Println(reverse([]int{1, 2, 3, 4, 5})) \u002F\u002F [5 4 3 2 1]\n    fmt.Println(reverse([]int{1}))              \u002F\u002F [1]\n    fmt.Println(reverse([]int{}))               \u002F\u002F []\n}\n",[46,3575,3576,3582,3586,3596,3600,3620,3638,3654,3677,3682,3688,3692,3696,3704,3744,3768,3788],{"__ignoreMap":44},[49,3577,3578,3580],{"class":51,"line":52},[49,3579,2992],{"class":55},[49,3581,2995],{"class":292},[49,3583,3584],{"class":51,"line":77},[49,3585,283],{"emptyLinePlaceholder":282},[49,3587,3588,3590,3592,3594],{"class":51,"line":117},[49,3589,2157],{"class":55},[49,3591,2160],{"class":1229},[49,3593,3008],{"class":292},[49,3595,2166],{"class":1229},[49,3597,3598],{"class":51,"line":279},[49,3599,283],{"emptyLinePlaceholder":282},[49,3601,3602,3604,3606,3608,3610,3612,3614,3616,3618],{"class":51,"line":286},[49,3603,325],{"class":55},[49,3605,3185],{"class":292},[49,3607,331],{"class":59},[49,3609,507],{"class":334},[49,3611,529],{"class":59},[49,3613,70],{"class":55},[49,3615,2430],{"class":59},[49,3617,70],{"class":55},[49,3619,458],{"class":59},[49,3621,3622,3624,3626,3628,3630,3632,3634,3636],{"class":51,"line":302},[49,3623,2321],{"class":59},[49,3625,83],{"class":55},[49,3627,974],{"class":292},[49,3629,977],{"class":59},[49,3631,70],{"class":55},[49,3633,101],{"class":59},[49,3635,556],{"class":292},[49,3637,1254],{"class":59},[49,3639,3640,3643,3646,3648,3651],{"class":51,"line":410},[49,3641,3642],{"class":55},"    for",[49,3644,3645],{"class":59}," i, v ",[49,3647,83],{"class":55},[49,3649,3650],{"class":55}," range",[49,3652,3653],{"class":59}," s {\n",[49,3655,3656,3659,3661,3663,3665,3667,3669,3672,3674],{"class":51,"line":1271},[49,3657,3658],{"class":59},"        result[",[49,3660,556],{"class":292},[49,3662,1946],{"class":59},[49,3664,1949],{"class":55},[49,3666,98],{"class":63},[49,3668,1949],{"class":55},[49,3670,3671],{"class":59},"i] ",[49,3673,273],{"class":55},[49,3675,3676],{"class":59}," v\n",[49,3678,3679],{"class":51,"line":1277},[49,3680,3681],{"class":59},"    }\n",[49,3683,3684,3686],{"class":51,"line":1283},[49,3685,2439],{"class":55},[49,3687,2520],{"class":59},[49,3689,3690],{"class":51,"line":1289},[49,3691,247],{"class":59},[49,3693,3694],{"class":51,"line":1295},[49,3695,283],{"emptyLinePlaceholder":282},[49,3697,3698,3700,3702],{"class":51,"line":1301},[49,3699,325],{"class":55},[49,3701,3021],{"class":292},[49,3703,3024],{"class":59},[49,3705,3706,3708,3710,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738,3741],{"class":51,"line":3285},[49,3707,1221],{"class":59},[49,3709,293],{"class":292},[49,3711,331],{"class":59},[49,3713,3138],{"class":292},[49,3715,977],{"class":59},[49,3717,70],{"class":55},[49,3719,95],{"class":59},[49,3721,98],{"class":63},[49,3723,101],{"class":59},[49,3725,104],{"class":63},[49,3727,101],{"class":59},[49,3729,64],{"class":63},[49,3731,101],{"class":59},[49,3733,192],{"class":63},[49,3735,101],{"class":59},[49,3737,626],{"class":63},[49,3739,3740],{"class":59},"})) ",[49,3742,3743],{"class":73},"\u002F\u002F [5 4 3 2 1]\n",[49,3745,3746,3748,3750,3752,3754,3756,3758,3760,3762,3765],{"class":51,"line":3295},[49,3747,1221],{"class":59},[49,3749,293],{"class":292},[49,3751,331],{"class":59},[49,3753,3138],{"class":292},[49,3755,977],{"class":59},[49,3757,70],{"class":55},[49,3759,95],{"class":59},[49,3761,98],{"class":63},[49,3763,3764],{"class":59},"}))              ",[49,3766,3767],{"class":73},"\u002F\u002F [1]\n",[49,3769,3771,3773,3775,3777,3779,3781,3783,3786],{"class":51,"line":3770},16,[49,3772,1221],{"class":59},[49,3774,293],{"class":292},[49,3776,331],{"class":59},[49,3778,3138],{"class":292},[49,3780,977],{"class":59},[49,3782,70],{"class":55},[49,3784,3785],{"class":59},"{}))               ",[49,3787,2236],{"class":73},[49,3789,3791],{"class":51,"line":3790},17,[49,3792,247],{"class":59},[19,3794],{},[16,3796,3797],{},[30,3798,3799],{},"Задача 2: Ловушка общего underlying array",[16,3801,3802,3804],{},[30,3803,3535],{}," Средняя",[16,3806,3807,3809],{},[30,3808,3541],{}," понимание того что срезы разделяют underlying array",[16,3811,3812,3814],{},[30,3813,3547],{}," Что выведет код? Объясни каждый вывод.",[39,3816,3818],{"className":41,"code":3817,"language":43,"meta":44,"style":44},"package main\n\nimport \"fmt\"\n\nfunc main() {\n    original := []int{1, 2, 3, 4, 5}\n\n    a := original[1:3]\n    b := original[1:3]\n\n    a[0] = 99\n\n    fmt.Println(original) \u002F\u002F ?\n    fmt.Println(a)        \u002F\u002F ?\n    fmt.Println(b)        \u002F\u002F ?\n\n    a = append(a, 999)\n\n    fmt.Println(original) \u002F\u002F ?\n    fmt.Println(a)        \u002F\u002F ?\n    fmt.Println(b)        \u002F\u002F ?\n}\n",[46,3819,3820,3826,3830,3840,3844,3852,3884,3888,3905,3921,3925,3938,3942,3953,3964,3975,3979,3995,4000,4011,4022,4033],{"__ignoreMap":44},[49,3821,3822,3824],{"class":51,"line":52},[49,3823,2992],{"class":55},[49,3825,2995],{"class":292},[49,3827,3828],{"class":51,"line":77},[49,3829,283],{"emptyLinePlaceholder":282},[49,3831,3832,3834,3836,3838],{"class":51,"line":117},[49,3833,2157],{"class":55},[49,3835,2160],{"class":1229},[49,3837,3008],{"class":292},[49,3839,2166],{"class":1229},[49,3841,3842],{"class":51,"line":279},[49,3843,283],{"emptyLinePlaceholder":282},[49,3845,3846,3848,3850],{"class":51,"line":286},[49,3847,325],{"class":55},[49,3849,3021],{"class":292},[49,3851,3024],{"class":59},[49,3853,3854,3856,3858,3860,3862,3864,3866,3868,3870,3872,3874,3876,3878,3880,3882],{"class":51,"line":302},[49,3855,3234],{"class":59},[49,3857,83],{"class":55},[49,3859,529],{"class":59},[49,3861,70],{"class":55},[49,3863,95],{"class":59},[49,3865,98],{"class":63},[49,3867,101],{"class":59},[49,3869,104],{"class":63},[49,3871,101],{"class":59},[49,3873,64],{"class":63},[49,3875,101],{"class":59},[49,3877,192],{"class":63},[49,3879,101],{"class":59},[49,3881,626],{"class":63},[49,3883,247],{"class":59},[49,3885,3886],{"class":51,"line":410},[49,3887,283],{"emptyLinePlaceholder":282},[49,3889,3890,3892,3894,3897,3899,3901,3903],{"class":51,"line":1271},[49,3891,3385],{"class":59},[49,3893,83],{"class":55},[49,3895,3896],{"class":59}," original[",[49,3898,98],{"class":63},[49,3900,651],{"class":59},[49,3902,64],{"class":63},[49,3904,2903],{"class":59},[49,3906,3907,3909,3911,3913,3915,3917,3919],{"class":51,"line":1277},[49,3908,3422],{"class":59},[49,3910,83],{"class":55},[49,3912,3896],{"class":59},[49,3914,98],{"class":63},[49,3916,651],{"class":59},[49,3918,64],{"class":63},[49,3920,2903],{"class":59},[49,3922,3923],{"class":51,"line":1283},[49,3924,283],{"emptyLinePlaceholder":282},[49,3926,3927,3930,3932,3934,3936],{"class":51,"line":1289},[49,3928,3929],{"class":59},"    a[",[49,3931,267],{"class":63},[49,3933,270],{"class":59},[49,3935,273],{"class":55},[49,3937,276],{"class":63},[49,3939,3940],{"class":51,"line":1295},[49,3941,283],{"emptyLinePlaceholder":282},[49,3943,3944,3946,3948,3950],{"class":51,"line":1301},[49,3945,1221],{"class":59},[49,3947,293],{"class":292},[49,3949,1825],{"class":59},[49,3951,3952],{"class":73},"\u002F\u002F ?\n",[49,3954,3955,3957,3959,3962],{"class":51,"line":3285},[49,3956,1221],{"class":59},[49,3958,293],{"class":292},[49,3960,3961],{"class":59},"(a)        ",[49,3963,3952],{"class":73},[49,3965,3966,3968,3970,3973],{"class":51,"line":3295},[49,3967,1221],{"class":59},[49,3969,293],{"class":292},[49,3971,3972],{"class":59},"(b)        ",[49,3974,3952],{"class":73},[49,3976,3977],{"class":51,"line":3770},[49,3978,283],{"emptyLinePlaceholder":282},[49,3980,3981,3983,3985,3987,3990,3993],{"class":51,"line":3790},[49,3982,3385],{"class":59},[49,3984,273],{"class":55},[49,3986,1071],{"class":292},[49,3988,3989],{"class":59},"(a, ",[49,3991,3992],{"class":63},"999",[49,3994,1079],{"class":59},[49,3996,3998],{"class":51,"line":3997},18,[49,3999,283],{"emptyLinePlaceholder":282},[49,4001,4003,4005,4007,4009],{"class":51,"line":4002},19,[49,4004,1221],{"class":59},[49,4006,293],{"class":292},[49,4008,1825],{"class":59},[49,4010,3952],{"class":73},[49,4012,4014,4016,4018,4020],{"class":51,"line":4013},20,[49,4015,1221],{"class":59},[49,4017,293],{"class":292},[49,4019,3961],{"class":59},[49,4021,3952],{"class":73},[49,4023,4025,4027,4029,4031],{"class":51,"line":4024},21,[49,4026,1221],{"class":59},[49,4028,293],{"class":292},[49,4030,3972],{"class":59},[49,4032,3952],{"class":73},[49,4034,4036],{"class":51,"line":4035},22,[49,4037,247],{"class":59},[16,4039,4040],{},[30,4041,4042],{},"Ожидаемый ответ:",[39,4044,4047],{"className":4045,"code":4046,"language":3563},[3561],"[1 99 3 4 5]   \u002F\u002F original изменился — a смотрит в тот же массив\n[99 3]         \u002F\u002F a видит изменение\n[99 3]         \u002F\u002F b тоже видит — один underlying array\n\n[1 99 3 999 5] \u002F\u002F append без реаллокации — пишет в original[3]\n[99 3 999]     \u002F\u002F a вырос\n[99 3]         \u002F\u002F b не знает о новом элементе — его len=2\n",[46,4048,4046],{"__ignoreMap":44},[16,4050,4051],{},[30,4052,3570],{},[39,4054,4056],{"className":41,"code":4055,"language":43,"meta":44,"style":44},"\u002F\u002F a и b — разные заголовки (SliceHeader), но Data указывает\n\u002F\u002F в один и тот же underlying array — original.\n\u002F\u002F\n\u002F\u002F a[0] = 99 меняет original[1] — все видят изменение.\n\u002F\u002F\n\u002F\u002F append(a, 999): len(a)=2, cap(a)=4 — места хватает.\n\u002F\u002F Реаллокации нет. 999 пишется в original[3].\n\u002F\u002F original видит изменение, b — нет (len(b)=2, 999 за его пределами).\n\u002F\u002F\n\u002F\u002F Защита: трёхиндексный срез a := original[1:3:3]\n\u002F\u002F ограничивает cap=2, и append создаст новый массив.\n",[46,4057,4058,4063,4068,4073,4078,4082,4087,4092,4097,4101,4106],{"__ignoreMap":44},[49,4059,4060],{"class":51,"line":52},[49,4061,4062],{"class":73},"\u002F\u002F a и b — разные заголовки (SliceHeader), но Data указывает\n",[49,4064,4065],{"class":51,"line":77},[49,4066,4067],{"class":73},"\u002F\u002F в один и тот же underlying array — original.\n",[49,4069,4070],{"class":51,"line":117},[49,4071,4072],{"class":73},"\u002F\u002F\n",[49,4074,4075],{"class":51,"line":279},[49,4076,4077],{"class":73},"\u002F\u002F a[0] = 99 меняет original[1] — все видят изменение.\n",[49,4079,4080],{"class":51,"line":286},[49,4081,4072],{"class":73},[49,4083,4084],{"class":51,"line":302},[49,4085,4086],{"class":73},"\u002F\u002F append(a, 999): len(a)=2, cap(a)=4 — места хватает.\n",[49,4088,4089],{"class":51,"line":410},[49,4090,4091],{"class":73},"\u002F\u002F Реаллокации нет. 999 пишется в original[3].\n",[49,4093,4094],{"class":51,"line":1271},[49,4095,4096],{"class":73},"\u002F\u002F original видит изменение, b — нет (len(b)=2, 999 за его пределами).\n",[49,4098,4099],{"class":51,"line":1277},[49,4100,4072],{"class":73},[49,4102,4103],{"class":51,"line":1283},[49,4104,4105],{"class":73},"\u002F\u002F Защита: трёхиндексный срез a := original[1:3:3]\n",[49,4107,4108],{"class":51,"line":1289},[49,4109,4110],{"class":73},"\u002F\u002F ограничивает cap=2, и append создаст новый массив.\n",[19,4112],{},[16,4114,4115],{},[30,4116,4117],{},"Задача 3: Удаление дублей с сохранением порядка",[16,4119,4120,4122],{},[30,4121,3535],{}," Сложная",[16,4124,4125,4127],{},[30,4126,3541],{}," эффективная работа со слайсами и map, алгоритмическое мышление",[16,4129,4130,3548,4132,4135],{},[30,4131,3547],{},[46,4133,4134],{},"unique(s []int) []int"," которая удаляет дубликаты из слайса сохраняя порядок первого появления элементов. Реализуй без создания дополнительного слайса для результата — модифицируй исходный на месте.",[16,4137,4138],{},[30,4139,3557],{},[39,4141,4144],{"className":4142,"code":4143,"language":3563},[3561],"unique([]int{1, 2, 2, 3, 1, 4}) → [1 2 3 4]\nunique([]int{1, 1, 1, 1})       → [1]\nunique([]int{1, 2, 3})          → [1 2 3]\nunique([]int{})                 → []\n",[46,4145,4143],{"__ignoreMap":44},[16,4147,4148,4151],{},[30,4149,4150],{},"Подсказка:"," Используй map как множество уже встреченных элементов. Для модификации на месте — два указателя: один читает, другой пишет.",[16,4153,4154],{},[30,4155,3570],{},[39,4157,4159],{"className":41,"code":4158,"language":43,"meta":44,"style":44},"package main\n\nimport \"fmt\"\n\nfunc unique(s []int) []int {\n    seen := make(map[int]struct{})\n    write := 0 \u002F\u002F указатель записи\n\n    for _, v := range s {\n        if _, exists := seen[v]; !exists {\n            seen[v] = struct{}{}\n            s[write] = v \u002F\u002F пишем на место write\n            write++\n        }\n    }\n\n    return s[:write] \u002F\u002F обрезаем до количества уникальных\n}\n\nfunc main() {\n    fmt.Println(unique([]int{1, 2, 2, 3, 1, 4})) \u002F\u002F [1 2 3 4]\n    fmt.Println(unique([]int{1, 1, 1, 1}))        \u002F\u002F [1]\n    fmt.Println(unique([]int{1, 2, 3}))           \u002F\u002F [1 2 3]\n    fmt.Println(unique([]int{}))                  \u002F\u002F []\n}\n\n\u002F\u002F Сложность: O(n) по времени, O(n) по памяти (map).\n\u002F\u002F Модифицируем исходный слайс на месте — не создаём новый.\n",[46,4160,4161,4167,4171,4181,4185,4206,4233,4245,4249,4262,4281,4293,4306,4314,4319,4323,4327,4337,4341,4345,4353,4396,4431,4464,4484,4489,4494,4500],{"__ignoreMap":44},[49,4162,4163,4165],{"class":51,"line":52},[49,4164,2992],{"class":55},[49,4166,2995],{"class":292},[49,4168,4169],{"class":51,"line":77},[49,4170,283],{"emptyLinePlaceholder":282},[49,4172,4173,4175,4177,4179],{"class":51,"line":117},[49,4174,2157],{"class":55},[49,4176,2160],{"class":1229},[49,4178,3008],{"class":292},[49,4180,2166],{"class":1229},[49,4182,4183],{"class":51,"line":279},[49,4184,283],{"emptyLinePlaceholder":282},[49,4186,4187,4189,4192,4194,4196,4198,4200,4202,4204],{"class":51,"line":286},[49,4188,325],{"class":55},[49,4190,4191],{"class":292}," unique",[49,4193,331],{"class":59},[49,4195,507],{"class":334},[49,4197,529],{"class":59},[49,4199,70],{"class":55},[49,4201,2430],{"class":59},[49,4203,70],{"class":55},[49,4205,458],{"class":59},[49,4207,4208,4211,4213,4215,4217,4220,4223,4225,4227,4230],{"class":51,"line":302},[49,4209,4210],{"class":59},"    seen ",[49,4212,83],{"class":55},[49,4214,974],{"class":292},[49,4216,331],{"class":59},[49,4218,4219],{"class":55},"map",[49,4221,4222],{"class":59},"[",[49,4224,70],{"class":55},[49,4226,67],{"class":59},[49,4228,4229],{"class":55},"struct",[49,4231,4232],{"class":59},"{})\n",[49,4234,4235,4238,4240,4242],{"class":51,"line":410},[49,4236,4237],{"class":59},"    write ",[49,4239,83],{"class":55},[49,4241,1187],{"class":63},[49,4243,4244],{"class":73}," \u002F\u002F указатель записи\n",[49,4246,4247],{"class":51,"line":1271},[49,4248,283],{"emptyLinePlaceholder":282},[49,4250,4251,4253,4256,4258,4260],{"class":51,"line":1277},[49,4252,3642],{"class":55},[49,4254,4255],{"class":59}," _, v ",[49,4257,83],{"class":55},[49,4259,3650],{"class":55},[49,4261,3653],{"class":59},[49,4263,4264,4267,4270,4272,4275,4278],{"class":51,"line":1283},[49,4265,4266],{"class":55},"        if",[49,4268,4269],{"class":59}," _, exists ",[49,4271,83],{"class":55},[49,4273,4274],{"class":59}," seen[v]; ",[49,4276,4277],{"class":55},"!",[49,4279,4280],{"class":59},"exists {\n",[49,4282,4283,4286,4288,4290],{"class":51,"line":1289},[49,4284,4285],{"class":59},"            seen[v] ",[49,4287,273],{"class":55},[49,4289,455],{"class":55},[49,4291,4292],{"class":59},"{}{}\n",[49,4294,4295,4298,4300,4303],{"class":51,"line":1295},[49,4296,4297],{"class":59},"            s[write] ",[49,4299,273],{"class":55},[49,4301,4302],{"class":59}," v ",[49,4304,4305],{"class":73},"\u002F\u002F пишем на место write\n",[49,4307,4308,4311],{"class":51,"line":1301},[49,4309,4310],{"class":59},"            write",[49,4312,4313],{"class":55},"++\n",[49,4315,4316],{"class":51,"line":3285},[49,4317,4318],{"class":59},"        }\n",[49,4320,4321],{"class":51,"line":3295},[49,4322,3681],{"class":59},[49,4324,4325],{"class":51,"line":3770},[49,4326,283],{"emptyLinePlaceholder":282},[49,4328,4329,4331,4334],{"class":51,"line":3790},[49,4330,2439],{"class":55},[49,4332,4333],{"class":59}," s[:write] ",[49,4335,4336],{"class":73},"\u002F\u002F обрезаем до количества уникальных\n",[49,4338,4339],{"class":51,"line":3997},[49,4340,247],{"class":59},[49,4342,4343],{"class":51,"line":4002},[49,4344,283],{"emptyLinePlaceholder":282},[49,4346,4347,4349,4351],{"class":51,"line":4013},[49,4348,325],{"class":55},[49,4350,3021],{"class":292},[49,4352,3024],{"class":59},[49,4354,4355,4357,4359,4361,4364,4366,4368,4370,4372,4374,4376,4378,4380,4382,4384,4386,4388,4390,4392,4394],{"class":51,"line":4024},[49,4356,1221],{"class":59},[49,4358,293],{"class":292},[49,4360,331],{"class":59},[49,4362,4363],{"class":292},"unique",[49,4365,977],{"class":59},[49,4367,70],{"class":55},[49,4369,95],{"class":59},[49,4371,98],{"class":63},[49,4373,101],{"class":59},[49,4375,104],{"class":63},[49,4377,101],{"class":59},[49,4379,104],{"class":63},[49,4381,101],{"class":59},[49,4383,64],{"class":63},[49,4385,101],{"class":59},[49,4387,98],{"class":63},[49,4389,101],{"class":59},[49,4391,192],{"class":63},[49,4393,3740],{"class":59},[49,4395,1091],{"class":73},[49,4397,4398,4400,4402,4404,4406,4408,4410,4412,4414,4416,4418,4420,4422,4424,4426,4429],{"class":51,"line":4035},[49,4399,1221],{"class":59},[49,4401,293],{"class":292},[49,4403,331],{"class":59},[49,4405,4363],{"class":292},[49,4407,977],{"class":59},[49,4409,70],{"class":55},[49,4411,95],{"class":59},[49,4413,98],{"class":63},[49,4415,101],{"class":59},[49,4417,98],{"class":63},[49,4419,101],{"class":59},[49,4421,98],{"class":63},[49,4423,101],{"class":59},[49,4425,98],{"class":63},[49,4427,4428],{"class":59},"}))        ",[49,4430,3767],{"class":73},[49,4432,4434,4436,4438,4440,4442,4444,4446,4448,4450,4452,4454,4456,4458,4461],{"class":51,"line":4433},23,[49,4435,1221],{"class":59},[49,4437,293],{"class":292},[49,4439,331],{"class":59},[49,4441,4363],{"class":292},[49,4443,977],{"class":59},[49,4445,70],{"class":55},[49,4447,95],{"class":59},[49,4449,98],{"class":63},[49,4451,101],{"class":59},[49,4453,104],{"class":63},[49,4455,101],{"class":59},[49,4457,64],{"class":63},[49,4459,4460],{"class":59},"}))           ",[49,4462,4463],{"class":73},"\u002F\u002F [1 2 3]\n",[49,4465,4467,4469,4471,4473,4475,4477,4479,4482],{"class":51,"line":4466},24,[49,4468,1221],{"class":59},[49,4470,293],{"class":292},[49,4472,331],{"class":59},[49,4474,4363],{"class":292},[49,4476,977],{"class":59},[49,4478,70],{"class":55},[49,4480,4481],{"class":59},"{}))                  ",[49,4483,2236],{"class":73},[49,4485,4487],{"class":51,"line":4486},25,[49,4488,247],{"class":59},[49,4490,4492],{"class":51,"line":4491},26,[49,4493,283],{"emptyLinePlaceholder":282},[49,4495,4497],{"class":51,"line":4496},27,[49,4498,4499],{"class":73},"\u002F\u002F Сложность: O(n) по времени, O(n) по памяти (map).\n",[49,4501,4503],{"class":51,"line":4502},28,[49,4504,4505],{"class":73},"\u002F\u002F Модифицируем исходный слайс на месте — не создаём новый.\n",[4507,4508,4509],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":44,"searchDepth":77,"depth":77,"links":4511},[4512,4515,4519,4520,4524,4528,4529,4530,4531],{"id":24,"depth":77,"text":25,"children":4513},[4514],{"id":211,"depth":117,"text":212},{"id":431,"depth":77,"text":432,"children":4516},[4517,4518],{"id":584,"depth":117,"text":585},{"id":826,"depth":117,"text":827},{"id":953,"depth":77,"text":954},{"id":1027,"depth":77,"text":1028,"children":4521},[4522,4523],{"id":1107,"depth":117,"text":1108},{"id":1307,"depth":117,"text":1308},{"id":1567,"depth":77,"text":1568,"children":4525},[4526,4527],{"id":1683,"depth":117,"text":1684},{"id":1860,"depth":117,"text":1861},{"id":1977,"depth":77,"text":1978},{"id":2259,"depth":77,"text":2260},{"id":2529,"depth":77,"text":2530},{"id":2841,"depth":77,"text":2842},1781022063357]