{"id":331890,"date":"2022-04-13T21:00:07","date_gmt":"2022-04-13T21:00:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=331890"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=331890","title":{"rendered":"<span>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 append \u0432 Go 1.18<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0440\u0435\u043b\u0438\u0437 Go 1.18, \u0433\u0432\u043e\u0437\u0434\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438. \u041d\u043e \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u0430 \u043c\u043d\u0435 \u043d\u0435\u0447\u0435\u0433\u043e \u043a \u043d\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<blockquote>\n<p><code>The built-in function\u00a0append\u00a0now uses a slightly different formula when deciding how much to grow a slice when it must allocate a new underlying array. The new formula is less prone to sudden transitions in allocation behavior.<\/code><\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c append \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0437\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0418 \u043e\u043d\u0430 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u0430 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0418 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e)<\/p>\n<h2>\u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435? <\/h2>\n<pre><code class=\"go\">func growslice(et *_type, old slice, cap int) slice { \u00a0 \u00a0 ...  if cap &lt; old.cap { panic(errorString(\"growslice: cap out of range\")) }  if et.size == 0 { \/\/ append should not create a slice with nil pointer but non-zero len. \/\/ We assume that append doesn't need to preserve old.array in this case. return slice{unsafe.Pointer(&amp;zerobase), old.len, cap} }  newcap := old.cap doublecap := newcap + newcap  if cap > doublecap { newcap = cap } else { if old.cap &lt; 1024 { newcap = doublecap } else { \/\/ Check 0 &lt; newcap to detect overflow \/\/ and prevent an infinite loop. for 0 &lt; newcap &amp;&amp; newcap &lt; cap { newcap += newcap \/ 4 }  \/\/ Set newcap to the requested cap when \/\/ the newcap calculation overflowed. if newcap &lt;= 0 { newcap = cap } } } ... }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>cap<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 <code>old.cap<\/code>, \u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>cap<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u043e\u0439 <code>newcap<\/code>  .<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0440\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>old.cap<\/code> \u043c\u0435\u043d\u044c\u0448\u0435 1024. \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e <code>newcap<\/code>  \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 2 \u0440\u0430\u0437\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 (old.cap), \u0442\u043e \u0435\u0441\u0442\u044c <code>newcap = doublecap<\/code><\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0441\u0440\u0435\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u0430 1024, \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>newcap<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0442\u0430\u0440\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 <code>old.cap<\/code> \u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\/4 \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439, \u0433\u0434\u0435 <code>newcap = old.cap, \u0434\u043b\u044f {newcap + = newcap \/ 4}<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e <code>newcap<\/code> \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 <code>cap<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c <code>newcap >= cap<\/code><\/p>\n<\/li>\n<\/ol>\n<h2>\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0421\u0442\u0430\u0440\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0430 \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044f\u043c, \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>func main() { for i := 0; i &lt; 2000; i += 100 { fmt.Println(i, cap(append(make([]bool, i), true))) } }<\/code><\/pre>\n<pre><code>0 8 100 208 200 416 300 640 400 896 500 1024 600 1280 700 1408 800 1792 900 2048 1000 2048 1100 1408 &lt;- \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u0438 (\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435)  1200 1536 1300 1792 1400 1792 1500 2048 1600 2048 1700 2304 1800 2304 1900 2688 1000 2048<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/RJbEkmFsPKM?v=goprev\" rel=\"noopener noreferrer nofollow\">https:\/\/go.dev\/play\/p\/RJbEkmFsPKM?v=goprev<\/a><\/p>\n<h2>\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a<\/h2>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0441 20 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/p>\n<p>\u0411\u044b\u043b\u043e:<\/p>\n<pre><code class=\"go\">if old.cap &lt; 1024 { newcap = doublecap } else { \/\/ Check 0 &lt; newcap to detect overflow \/\/ and prevent an infinite loop. for 0 &lt; newcap &amp;&amp; newcap &lt; cap { newcap += newcap \/ 4 } <\/code><\/pre>\n<p>\u0421\u0442\u0430\u043b\u043e:<\/p>\n<pre><code class=\"go\">const threshold = 256 if old.cap &lt; threshold { newcap = doublecap } else { \/\/ Check 0 &lt; newcap to detect overflow \/\/ and prevent an infinite loop. for 0 &lt; newcap &amp;&amp; newcap &lt; cap { \/\/ Transition from growing 2x for small slices \/\/ to growing 1.25x for large slices. This formula \/\/ gives a smooth-ish transition between the two. newcap += (newcap + 3*threshold) \/ 4 } <\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0440\u043e\u0433 <code>256<\/code> , \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0443\u0435\u0442 \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0440\u0435\u0437. (\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a \u0435\u043c\u043a\u043e\u0441\u0442\u044f\u043c [256,1024] \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441 \u0435\u043c\u043a\u043e\u0441\u0442\u044f\u043c\u0438 [1024,&#8230;]).<\/p>\n<p>\u0410 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0437\u0430 \u0441\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0441 <code>newcap += newcap \/ 4<\/code>  \u043d\u0430  <code>newcap += (newcap + 3*threshold) \/ 4<\/code>. \u0427\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u044b\u043c.<\/p>\n<pre><code>starting cap    growth factor 256             2.0 512             1.63 1024            1.44 2048            1.35 4096            1.30<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0432\u044b\u0432\u043e\u0434 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 &#171;\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u0438&#187;:<\/p>\n<pre><code>0 8 100 208 200 416 300 576 400 704 500 896 600 1024 700 1152 800 1280 900 1408 1000 1536 1100 1792 1200 1792 1300 2048 1400 2048 1500 2304 1600 2304 1700 2688 1800 2688 1900 2688<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0432 \u0445\u043e\u0434\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435: <\/p>\n<p><a href=\"https:\/\/groups.google.com\/g\/golang-nuts\/c\/UaVlMQ8Nz3o\" rel=\"noopener noreferrer nofollow\">https:\/\/groups.google.com\/g\/golang-nuts\/c\/UaVlMQ8Nz3o<\/a><\/p>\n<h2>\u041d\u0438\u0436\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438:<\/h2>\n<p><a href=\"https:\/\/tip.golang.org\/doc\/go1.18\" rel=\"noopener noreferrer nofollow\">https:\/\/tip.golang.org\/doc\/go1.18<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/golang\/go\/blob\/master\/src\/runtime\/slice.go\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/golang\/go\/blob\/master\/src\/runtime\/slice.go<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/660827\/\"> https:\/\/habr.com\/ru\/post\/660827\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0440\u0435\u043b\u0438\u0437 Go 1.18, \u0433\u0432\u043e\u0437\u0434\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438. \u041d\u043e \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u0430 \u043c\u043d\u0435 \u043d\u0435\u0447\u0435\u0433\u043e \u043a \u043d\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<blockquote>\n<p><code>The built-in function\u00a0append\u00a0now uses a slightly different formula when deciding how much to grow a slice when it must allocate a new underlying array. The new formula is less prone to sudden transitions in allocation behavior.<\/code><\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c append \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0437\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0418 \u043e\u043d\u0430 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u0430 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0418 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e)<\/p>\n<h2>\u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435? <\/h2>\n<pre><code class=\"go\">func growslice(et *_type, old slice, cap int) slice { \u00a0 \u00a0 ...  if cap &lt; old.cap { panic(errorString(\"growslice: cap out of range\")) }  if et.size == 0 { \/\/ append should not create a slice with nil pointer but non-zero len. \/\/ We assume that append doesn't need to preserve old.array in this case. return slice{unsafe.Pointer(&amp;zerobase), old.len, cap} }  newcap := old.cap doublecap := newcap + newcap  if cap > doublecap { newcap = cap } else { if old.cap &lt; 1024 { newcap = doublecap } else { \/\/ Check 0 &lt; newcap to detect overflow \/\/ and prevent an infinite loop. for 0 &lt; newcap &amp;&amp; newcap &lt; cap { newcap += newcap \/ 4 }  \/\/ Set newcap to the requested cap when \/\/ the newcap calculation overflowed. if newcap &lt;= 0 { newcap = cap } } } ... }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>cap<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 <code>old.cap<\/code>, \u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>cap<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u043e\u0439 <code>newcap<\/code>  .<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0440\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>old.cap<\/code> \u043c\u0435\u043d\u044c\u0448\u0435 1024. \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e <code>newcap<\/code>  \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 2 \u0440\u0430\u0437\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 (old.cap), \u0442\u043e \u0435\u0441\u0442\u044c <code>newcap = doublecap<\/code><\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0441\u0440\u0435\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u0430 1024, \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c <code>newcap<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0442\u0430\u0440\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 <code>old.cap<\/code> \u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\/4 \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439, \u0433\u0434\u0435 <code>newcap = old.cap, \u0434\u043b\u044f {newcap + = newcap \/ 4}<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e <code>newcap<\/code> \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 <code>cap<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c <code>newcap >= cap<\/code><\/p>\n<\/li>\n<\/ol>\n<h2>\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0421\u0442\u0430\u0440\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0430 \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044f\u043c, \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>func main() { for i := 0; i &lt; 2000; i += 100 { fmt.Println(i, cap(append(make([]bool, i), true))) } }<\/code><\/pre>\n<pre><code>0 8 100 208 200 416 300 640 400 896 500 1024 600 1280 700 1408 800 1792 900 2048 1000 2048 1100 1408 &lt;- \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u0438 (\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435)  1200 1536 1300 1792 1400 1792 1500 2048 1600 2048 1700 2304 1800 2304 1900 2688 1000 2048<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/RJbEkmFsPKM?v=goprev\" rel=\"noopener noreferrer nofollow\">https:\/\/go.dev\/play\/p\/RJbEkmFsPKM?v=goprev<\/a><\/p>\n<h2>\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a<\/h2>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0441 20 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/p>\n<p>\u0411\u044b\u043b\u043e:<\/p>\n<pre><code class=\"go\">if old.cap &lt; 1024 { newcap = doublecap } else { \/\/ Check 0 &lt; newcap to detect overflow \/\/ and prevent an infinite loop. for 0 &lt; newcap &amp;&amp; newcap &lt; cap { newcap += newcap \/ 4 } <\/code><\/pre>\n<p>\u0421\u0442\u0430\u043b\u043e:<\/p>\n<pre><code class=\"go\">const threshold = 256 if old.cap &lt; threshold { newcap = doublecap } else { \/\/ Check 0 &lt; newcap to detect overflow \/\/ and prevent an infinite loop. for 0 &lt; newcap &amp;&amp; newcap &lt; cap { \/\/ Transition from growing 2x for small slices \/\/ to growing 1.25x for large slices. This formula \/\/ gives a smooth-ish transition between the two. newcap += (newcap + 3*threshold) \/ 4 } <\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0440\u043e\u0433 <code>256<\/code> , \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0443\u0435\u0442 \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0440\u0435\u0437. (\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a \u0435\u043c\u043a\u043e\u0441\u0442\u044f\u043c [256,1024] \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441 \u0435\u043c\u043a\u043e\u0441\u0442\u044f\u043c\u0438 [1024,&#8230;]).<\/p>\n<p>\u0410 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0437\u0430 \u0441\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0441 <code>newcap += newcap \/ 4<\/code>  \u043d\u0430  <code>newcap += (newcap + 3*threshold) \/ 4<\/code>. \u0427\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u044b\u043c.<\/p>\n<pre><code>starting cap    growth factor 256             2.0 512             1.63 1024            1.44 2048            1.35 4096            1.30<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0432\u044b\u0432\u043e\u0434 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 &#171;\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u0438&#187;:<\/p>\n<pre><code>0 8 100 208 200 416 300 576 400 704 500 896 600 1024 700 1152 800 1280 900 1408 1000 1536 1100 1792 1200 1792 1300 2048 1400 2048 1500 2304 1600 2304 1700 2688 1800 2688 1900 2688<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0432 \u0445\u043e\u0434\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435: <\/p>\n<p><a href=\"https:\/\/groups.google.com\/g\/golang-nuts\/c\/UaVlMQ8Nz3o\" rel=\"noopener noreferrer nofollow\">https:\/\/groups.google.com\/g\/golang-nuts\/c\/UaVlMQ8Nz3o<\/a><\/p>\n<h2>\u041d\u0438\u0436\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438:<\/h2>\n<p><a href=\"https:\/\/tip.golang.org\/doc\/go1.18\" rel=\"noopener noreferrer nofollow\">https:\/\/tip.golang.org\/doc\/go1.18<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/golang\/go\/blob\/master\/src\/runtime\/slice.go\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/golang\/go\/blob\/master\/src\/runtime\/slice.go<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/660827\/\"> https:\/\/habr.com\/ru\/post\/660827\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-331890","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=331890"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331890\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=331890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=331890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=331890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}