介绍
Golang中怎么利用片对添加进行扩容,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
//,grow grows 从而slice s so that it 还要于extra more 价值观,分配//,more capacity  if 只需要It also returns 从而old 以及new slice 长度。 func 生长(s 价值,extra int),(价值,,int, int), { ,,,i0 :=, s.Len () ,,,i1 :=, i0 +额外的 ,,,if i1 & lt;, i0 { ,,,,,,,恐慌(“reflect.Append: slice overflow") ,,,} ,,,m :=, s.Cap () ,,,if i1 & lt;=, m { ,,,,,,,return s.Slice (0, i1),钱数,i1 ,,,} ,,,if m ==, 0, { ,,,,,,,m =,额外的 ,,,},{else ,,,,,,,for m & lt;, i1 { ,,,,,,,,,,,if i0 & lt;, 1024, { ,,,,,,,,,,,,,,,m +=, m ,,,,,,,,,,,},{else ,,,,,,,,,,,,,,,m +=, m /4 ,,,,,,,,,,,} ,,,,,,,} ,,,} ,,,t :=, MakeSlice (s.Type (),, i1,,米) ,,,(t, s)副本 ,,,return t,钱数,i1 }//,Append appends 从而values x 用a slice s 以及returns 从而resulting 切片。//,As 去,拷贝,each x # 39; s value must be assignable 用,片# 39;s element 类型。 func 附加(s 价值,x ……值),Value { ,,,s.mustBe(片) ,,,,,,i1 i0:=,增长(年代,,len (x)) ,,,for 我,j :=,钱数,,0;,小姐:& lt;, i1,,我,,j =, + 1,, j + 1, { ,,,,,,,s.Index (i)这里(x [j]) ,,,} ,,,return s }
首先将判断类型是否片,然后调用增长扩容,从l1 & lt;=m的判断可以发现确实容量足够的情况下,只是对原始数组建立一个新的片
但当容量不足时,可以看到只有在当前元素i0小于1024时,才是按2倍速度正常,否则其实每次只增长25%,代码验证如下:
func 主要(),{ ,,,str :=, (int [], 1023) ,,,fmt.Println (len (str),帽(str)) ,,,str =,附加(str, 1) ,,,fmt.Println (len (str),帽(str)) ,,,str =,附加(str, 1) ,,,fmt.Println (len (str),帽(str)) } 输出: 1023年,1023年 1024年,2048年 1025年,2048年
初始容量已经达到1024后,只增长了256
func 主要(),{ ,,,str :=, (int [], 1024) ,,,fmt.Println (len (str),帽(str)) ,,,str =,附加(str, 1) ,,,fmt.Println (len (str),帽(str)) ,,,str =,附加(str, 1) ,,,fmt.Println (len (str),帽(str)) } 输出: 1024年,1024年 1025年,1280年 1026,1280
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。