鍘熸枃鍦板潃锛氭繁鍏ョ悊瑙oSlice鏄粈涔堝湪Go涓紝Slice锛堝垏鐗囷級鏄湪Array锛堟暟缁勶級涔嬩笂鎶借薄鍑烘潵鐨勪竴绉嶇壒娈婄被鍨嬨€備负浜嗘洿濂界殑鐞嗚ВSlice锛岀涓€姝ラ渶瑕佺悊瑙rray銆傚湪娣卞埢鐞嗚В浜哠lice鍜孉rray鐨勫尯鍒箣鍚庯紝鎵嶈兘鏇村ソ鍦版帰绱㈠畠鐨勫簳灞傘€傜敤娉旳rrayfuncmain(){nums:=[3]int{}nums[0]=1n:=nums[0]n=2fmt.Printf("nums:%v\n",nums)fmt.Printf("n:%d\n",n)}鎴戜滑鍙互鐭ラ亾锛屽湪Go涓紝鏁扮粍绫诲瀷闇€瑕佹寚瀹氶暱搴﹀拰鍏冪礌绫诲瀷銆傚湪涓婇潰鐨勪唬鐮佷腑锛屾垜浠彲浠ョ湅鍒癧3]int{}浠h〃浜嗕竴涓寘鍚?涓暣鏁扮殑鏁扮粍锛屽苟涓斿凡缁忚鍒濆鍖栦簡銆傚簳灞傛暟鎹瓨鍌ㄤ负杩炵画鐨勫唴瀛樼┖闂达紝閫氳繃鍥哄畾鐨勭储寮曞€硷紙涓嬫爣锛夎繘琛屾绱€傚0鏄庢暟缁勫悗锛屽叾鍏冪礌鐨勫垵濮嬪€硷紙鍗抽浂鍊硷級涓?銆傚苟涓斿彉閲忓彲浠ョ洿鎺ヤ娇鐢紝涓嶉渶瑕佺壒娈婃搷浣滐紝鏁扮粍鐨勯暱搴︽槸鍥哄畾鐨勶紝鍏堕暱搴︿负閮ㄥ垎绫诲瀷锛屾墍浠3]int鍜孾4]int绫诲瀷涓嶅悓锛屼笉鑳界О涓衡€滀竴涓笢瑗库€濊緭鍑虹粨鏋渘ums:[100]n:2Slicefuncmain(){nums:=[3]int{}nums[0]=1dnums:=nums[:]fmt.Printf("dnums:%v",dnums)}Slice鏄疉rray鐨勬娊璞★紝绫诲瀷涓篬]T銆傚湪涓婇潰鐨勪唬鐮佷腑锛宒nums鍙橀噺鏄€氳繃nums[:]璧嬪€肩殑銆傞渶瑕佹敞鎰忕殑鏄紝涓嶢rray涓嶅悓锛孲lice涓嶉渶瑕佹寚瀹氶暱搴︺€備篃姣旇緝鐏垫椿锛屽彲浠ヨ嚜鍔ㄦ墿灞曟暟鎹粨鏋勭被鍨媠licestruct{arrayunsafe.Pointerlenintcapint}Slice鐨勫簳灞傛暟鎹粨鏋勫垎涓轰笁閮ㄥ垎锛屽涓嬶細array锛氭寚鍚戣寮曠敤鏁扮粍锛坲nsafe.鎸囬拡鍙互琛ㄧず鎸囧悜浠讳綍鍙鍧€鍊肩殑鎸囬拡锛塴en锛氶暱搴︼紝褰撳墠寮曠敤鍒囩墖鐨勫厓绱犱釜鏁癱ap锛氬閲忥紝褰撳墠寮曠敤鍒囩墖鐨勫閲忥紙搴曞眰鏁扮粍鐨勫厓绱犳€绘暟锛夈€傚疄闄呬娇鐢ㄤ腑锛宑ap蹇呴』澶т簬绛変簬len銆傚惁鍒欎細寮曡捣panicexample銆備负浜嗘洿濂界殑鐞嗚В锛屾垜浠洖椤句竴涓嬩笂涓€鑺傜殑浠g爜杩涜婕旂ず锛屽涓嬶細funcmain(){nums:=[3]int{}nums[0]=1dnums:=nums[:]fmt.Printf("dnums:%v",dnums)}鍦ㄤ唬鐮佷腑鍙互瑙傚療鍒癲nums:=nums[:]锛岃繖娈典唬鐮佺‘瀹氫簡Slice鐨凱ointer鎸囧悜鏁扮粍锛宭en鍜宑ap閮芥槸鍩烘湰灞炴€х殑闃靛垪銆備笌鍥惧舰琛ㄨ揪寮忎竴鑷磍en,capdifferentfuncmain(){nums:=[3]int{}nums[0]=1dnums:=nums[0:2]fmt.Printf("dnums:%v,len:%d,cap:%d",dnums,len(dnums),cap(dnums))}杈撳嚭缁撴灉dnums:[10],len:2,cap:3寰堟槑鏄撅紝杩欓噷鎸囧畾浜哠lice[0:2]锛屾墍浠en鏄紩鐢ㄥ厓绱犵殑鏁伴噺锛宑ap鏄紩鐢ㄦ暟缁勫厓绱犵殑鎬绘暟銆傜鍚堥鏈燄煒勫垱寤篠lice鏈変袱绉嶆柟寮忥紝濡備笅锛歷ar[]Tor[]T{}funcmake([]T,len,cap)[]T鍙互鍏虫敞make鍑芥暟锛屽ぇ瀹堕兘鐭ラ亾Slice闇€瑕佹寚鍚戜竴涓暟缁勩€傞偅涔坢ake鏄€庝箞鍋氬埌鐨勫憿锛熷畠浼氬湪璋冪敤make鏃跺垎閰嶄竴涓暟缁勫苟杩斿洖Slicefuncmakingslice(et*_type,len,capint)slice{maxElements:=maxSliceCap(et.size)iflen<0||uintptr(len)>maxElements{panic(errorString("makeslice:lenoutofrange"))}ifcapmaxElements{panic(errorString("makeslice:capoutofrange"))}p:=mallocgc(et.size*uintptr(cap),et,true)returnslice{p,len,cap}}鏍规嵁浼犲叆鐨凷lice绫诲瀷锛岃幏鍙栧叾绫诲瀷鍙互鐢宠鐨勬渶澶у閲忥紝鍒ゆ柇len鏄惁鍚堣锛屾鏌ユ槸鍚﹀湪0doublecap{newcap=cap}else{ifold.len<1024{newcap=doublecap}else{for0_MaxMemnewcap=int(capmem)...}濡傛灉cap_MaxMem{panic(errorString("growslice:capoutofrange"))}varpunsafe.Pointerifet.kind&kindNoPointers!=0{p=mallocgc(capmem,nil,false)memmove(p,old.array,lenmem)memclrNoHeapPointers(add(p,newlenmem),capmem-newlenmem)}else{p=mallocgc(capmem,et,true)if!writeBarrier.enabled{memmove(p,old.array,lenmem)}else{fori:=uintptr(0);鎴?鍒楅棬;鎴?=et.size{typedmemmove(et,add(p,i),add(old.array,i))}}}...}1銆傝幏鍙栨棫Slice鐨勯暱搴︼紝鍋囪鎵╁鍚庤绠楁柊Slice鐨勫厓绱犻暱搴︺€佸閲忓拰鎸囬拡鍦板潃锛堝悗缁唴瀛樻搷浣滅殑涓€绯诲垪鎿嶄綔锛?.纭繚鏂癝lice鐨勫閲忓ぇ浜庢柊Slice鐨勫閲忔棫鐨凷ice锛屾柊瀹归噺鐨勫唴瀛樺皬浜庢寚瀹氱殑鏈€澶у唴瀛樸€傚鏋滄病鏈夋孩鍑猴紝灏变細鎶涘嚭寮傚父銆?.濡傛灉鍏冪礌绫诲瀷鏄痥indNoPointers锛屽嵆闈炴寚閽堢被鍨嬨€傜劧鍚庡湪oldSlicecap涔嬪悗缁х画鎵╁厖Step1:鏍规嵁涔嬪墠璁$畻鐨刢apmem锛屽湪oldSlicecap涔嬪悗缁х画鐢宠鍐呭瓨绌洪棿锛岀劧鍚庣敤浜庢墿瀹筍tep2:鍦╫ld.array涓婂鍒秐涓瓧鑺傦紙鏍规嵁lenmem)鍒版柊鐨勫唴瀛樼┖闂寸涓夋锛氬皢鏂扮殑Slicecap鐨勫閲忓湴鍧€娣诲姞鍒版柊鐨勫唴瀛樼┖闂?p)銆傛渶缁堝緱鍒板畬鏁寸殑鏂癝licecap鍐呭瓨鍦板潃add(p,newlenmem)(ptr)Step4:Re-initializenbytesfromptr(capmem-newlenmem)娉細閭d箞闂鏉ヤ簡锛屼负浠€涔堣閲嶆柊鍒濆鍖栬繖鍧楀唴瀛樺憿锛燂紵杩欐槸鍥犱负ptr鏄湭鍒濆鍖栫殑鍐呭瓨锛堜緥濡傦細鍙噸澶嶄娇鐢ㄧ殑鍐呭瓨锛岄€氬父鐢ㄤ簬鏂扮殑鍐呭瓨鍒嗛厤锛夛紝鍏朵腑鍙兘鍖呭惈鈥滃瀮鍦锯€濄€傛墍浠ヨ繖閲屽簲璇ュ仛涓€娆♀€滄竻鐞嗏€濄€傛柟渚垮悗闈㈠疄闄呬娇鐢紙鎵╁睍锛?.濡傛灉3涓嶆弧瓒筹紝閲嶆柊鐢宠鍒濆鍖栦竴鍧楀唴瀛樼粰鏂扮殑Slice瀛樻斁Array5锛屾鏌ュ綋鍓嶆槸鍚﹀湪鎵цGC锛屽嵆褰撳墠鏄惁鍚敤浜哤riteBarrier锛屽鏋滃紑鍚殑璇濓紝浣跨敤typedmemmove鏂规硶浣跨敤鎸囬拡绠楁硶杩涜寰幆澶嶅埗銆傚惁鍒欙紝浣跨敤memmove鏂规硶灏唋enmem瀛楄妭浠巓ld.array鏁翠綋澶嶅埗鍒皃tr涓紝鏁堢巼鏇撮珮銆傛敞鎰忥細WriteBarrier涓€鑸湪GC鏍囪闃舵寮€鍚紝WriteBarrier鍙鎸囬拡寮€鍚€傞偅涔堝湪绗?鐐癸紝浣犲氨涓嶉毦鐞嗚В涓轰粈涔堜細鏈変袱绉嶅畬鍏ㄤ笉鍚岀殑澶勭悊鏂瑰紡浜嗭紝鏃х殑Slicecap鐨勫湴鍧€涔嬪悗锛岀户缁敵璇风┖闂存墿瀹瑰拰瀹舵棌鎼縼锛氶噸鏂扮敵璇蜂竴涓唴瀛樺湴鍧€锛岃縼绉诲苟浣滀负涓€涓暣浣撳睍寮€銆備袱涓皬鈥滈櫡闃扁€?.鐩稿悓鐨勬牴funcmain(){nums:=[3]int{}nums[0]=1fmt.Printf("nums:%v,len:%d,cap:%d\n",nums,len(nums),cap(nums))dnums:=nums[0:2]dnums[0]=5fmt.Printf("nums:%v,len:%d,cap:%d\n",nums,len(nums),cap(nums))fmt.Printf("dnums:%v,len:%d,cap:%d\n",dnums,len(dnums),cap(dnums))}杈撳嚭缁撴灉锛歯ums:[100],len:3,cap:3nums:[500],len:3,cap:3dnums:[50],len:2,cap:3灞曞紑鍓嶏紝鍒囩墖鏁扮粍鎸囧悜寮曠敤鐨勬暟缁勩€傚洜姝lice鍙戠敓浜嗗彉鍖栥€備細鐩存帴淇敼涓哄師鏉ョ殑Array锛堜袱鑰呮寚鐨勬槸鍚屼竴涓級銆傜浜岋紝鏃朵唬鍙樹簡銆傞殢鐫€Slice涓嶆柇杩藉姞锛屽唴閮ㄥ厓绱犺秺鏉ヨ秺澶氾紝鏈€缁堣Е鍙戞墿瀹广€備互涓嬩唬鐮侊細funcmain(){nums:=[3]int{}nums[0]=1fmt.Printf("nums:%v,len:%d,cap:%d\n",nums,len(nums),cap(nums))dnums:=nums[0:2]dnums=append(dnums,[]int{2,3}...)dnums[1]=1fmt.Printf("nums:%v,len:%d,cap:%d\n",nums,len(nums),cap(nums))fmt.Printf("dnums:%v,len:%d,cap:%d\n",dnums,len(dnums),cap(dnums))}杈撳嚭缁撴灉锛歯ums:[100],len:3,cap:3nums:[100],len:3,cap:3dnums:[1123],len:4,cap:6鍚慡lice杩藉姞鍏冪礌鏃讹紝濡傛灉婊¤冻鎵╁绛栫暐锛屽嵆鎻掑叆鍚庡師鏁扮粍瀹归噺瓒呰繃鏈€澶у€硷紝鍒欏湪鍐呴儴鐢宠涓€鍧楁柊鐨勫唴瀛樼┖闂达紝骞朵笖鍘熸潵鐨勫厓绱犱細琚獵opy涓€浠藉埌鏂扮殑鍐呭瓨绌洪棿銆傛鏃朵笌鍘熸暟缁勬病鏈夊叧绯伙紝淇敼鍚庣殑鍊间笉浼氭敼鍙樹负鍘熸暟缁勩€備笅闈㈡槸澶嶅埗鍘熷瀷funccopy(dst,src[]T)intcopy鍑芥暟锛岀敤浜庡皢鏁版嵁浠庢簮Slice澶嶅埗鍒扮洰鏍嘢lice銆傚畠杩斿洖澶嶅埗鐨勫厓绱犳暟銆傜ず渚媐uncmain(){dst:=[]int{1,2,3}src:=[]int{4,5,6,7,8}n:=copy(dst,src)fmt.Printf("dst:%v,n:%d",dst,n)}澶嶅埗鍔熻兘鏀寔鍦ㄤ笉鍚岄暱搴︾殑Slice涔嬮棿杩涜澶嶅埗銆傚鏋滈暱搴︿笉涓€鑷达紝鍒欐寜鐓ф渶灏戠殑Slice鍏冪礌涓暟杩涜澶嶅埗銆傞偅涔堝湪婧愪唬鐮佷腑濡備綍瀹屾垚杩欎釜琛屼负鐨勫鍒跺憿锛熸垜浠湅涓€涓嬫簮鐮佺殑瀹炵幇锛屽涓嬶細funcslicecopy(to,fmslice,widthuintptr)int{iffm.len==0||to.len==0{return0}n:=fm.lenifto.len