Go è¯è¨ç slice å¾å¥½ç¨ï¼ä¸è¿ä¹æä¸äºåãsliceÂ æ¯ Go è¯è¨ä¸ä¸ªå¾éè¦çæ°æ®ç»æãç½ä¸å·²ç»æå¾å¤æç« åè¿äºï¼ä¼¼ä¹æ²¡å¿
è¦ååã使¯æ¯ä¸ªäººçé®é¢çè§è§ä¸åï¼ååºæ¥çä¸è¥¿èªç¶ä¹ä¸ä¸æ ·ãæè¿ç¯ä¼ä»æ´åºå±çæ±ç¼è¯è¨å»è§£è¯»å®ãèä¸å¨æåè¿ç¯æç« çè¿ç¨ä¸ï¼åç°ç»å¤§é¨åæç« é½åå¨ä¸äºé®é¢ï¼æç« éä¼è®²å°ï¼è¿éå
ä¸å±å¼ã
æå¸ææ¬æå¯ä»¥ç»ç»è¿ä¸ªè¯é¢ï¼ä¸æ¬¡åæäººæ³åä½ è®¨è®ºÂ sliceï¼ç´æ¥æè¿ç¯æç« ç龿¥ä¸¢è¿å»å°±è¡äºã
æç §æ¯ä¾ï¼ä¸ºäºæ´å¥½çé 读ä½éªï¼æå¨è´´ä¸æç« çç®å½ï¼

彿们å¨è¯´ slice æ¶ï¼å°åºå¨è¯´ä»ä¹
sliceÂ ç¿»è¯æä¸æå°±æ¯åçï¼å®åæ°ç»ï¼arrayï¼å¾ç±»ä¼¼ï¼å¯ä»¥ç¨ä¸æ çæ¹å¼è¿è¡è®¿é®ï¼å¦æè¶çï¼å°±ä¼äº§ç panicã使¯å®æ¯æ°ç»æ´çµæ´»ï¼å¯ä»¥èªå¨å°è¿è¡æ©å®¹ã
äºè§£ slice çæ¬è´¨ï¼æç®åçæ¹æ³å°±æ¯çå®çæºä»£ç ï¼
çå°äºåï¼slice å
±æä¸ä¸ªå±æ§ï¼Â æéï¼æååºå±æ°ç»ï¼Â é¿åº¦ï¼è¡¨ç¤ºåçå¯ç¨å
ç´ ç个æ°ï¼ä¹å°±æ¯è¯´ä½¿ç¨ä¸æ 对 slice çå
ç´ è¿è¡è®¿é®æ¶ï¼ä¸æ ä¸è½è¶
è¿ slice çé¿åº¦ï¼Â 容éï¼åºå±æ°ç»çå
ç´ ä¸ªæ°ï¼å®¹é >= é¿åº¦ãå¨åºå±æ°ç»ä¸è¿è¡æ©å®¹çæ
åµä¸ï¼å®¹é乿¯ slice å¯ä»¥æ©å¼ çæå¤§é度ã

注æï¼åºå±æ°ç»æ¯å¯ä»¥è¢«å¤ä¸ª slice åæ¶æåçï¼å æ¤å¯¹ä¸ä¸ª slice çå ç´ è¿è¡æä½æ¯æå¯è½å½±åå°å ¶ä» slice çã
slice çå建
å建 slice çæ¹å¼æä»¥ä¸å ç§ï¼
| åºå· | æ¹å¼ | 代ç ç¤ºä¾ |
| 1 | ç´æ¥å£°æ | var slice []int |
| 2 | new | slice := *new([]int) |
| 3 | åé¢é | slice := []int{1,2,3,4,5} |
| 4 | make | slice := make([]int, 5, 10) |
| 5 | ä»åçææ°ç»âæªåâ | slice := array[1:5] æÂ slice := sourceSlice[1:5] |
ç´æ¥å£°æ
第ä¸ç§åå»ºåºæ¥ç slice å
¶å®æ¯ä¸ä¸ªÂ nil sliceãå®çé¿åº¦å容éé½ä¸º0ãånilæ¯è¾çç»æä¸ºtrueã
è¿éæ¯è¾æ··æ·çæ¯empty sliceï¼å®çé¿åº¦å容éä¹é½ä¸º0ï¼ä½æ¯ææç空åççæ°æ®æé齿ååä¸ä¸ªå°å 0xc42003bda0ã空åçå nil æ¯è¾çç»æä¸ºfalseã
å®ä»¬çå é¨ç»æå¦ä¸å¾ï¼

| å建æ¹å¼ | nilåç | 空åç |
| æ¹å¼ä¸ | var s1 []int | var s2 = []int{} |
| æ¹å¼äº | var s4 = *new([]int) | var s3 = make([]int, 0) |
| é¿åº¦ | 0 | 0 |
| 容é | 0 | 0 |
å nil æ¯è¾ | true | false |
nil åçå空åçå¾ç¸ä¼¼ï¼é¿åº¦å容é齿¯0ï¼å®æ¹å»ºè®®å°½é使ç¨Â nil åçã
å
³äºnil sliceåempty sliceçæ¢ç´¢å¯ä»¥åèå
¬ä¼å·âç æ´âä½è
èé±åçä¸ç¯æç« ãæ·±åº¦è§£æ Go è¯è¨ä¸ãåçãçä¸ç§ç¹æ®ç¶æãï¼å°åéå¨äºåèèµæé¨åã
åé¢é
æ¯è¾ç®åï¼ç´æ¥ç¨åå§å表达å¼å建ã
è¿è¡ç»æï¼
å¯ä¸å¼å¾æ³¨æçæ¯ä¸é¢ç代ç ä¾åä¸ä½¿ç¨äºç´¢å¼å·ï¼ç´æ¥èµå¼ï¼è¿æ ·ï¼å
¶ä»æªæ³¨æçå
ç´ åé»è®¤Â 0 å¼ã
make
make彿°éè¦ä¼ å
¥ä¸ä¸ªåæ°ï¼åçç±»åï¼é¿åº¦ï¼å®¹éãå½ç¶ï¼å®¹éå¯ä»¥ä¸ä¼ ï¼é»è®¤åé¿åº¦ç¸çã
ä¸ç¯æç« ãèµ°è¿Goçåºå±ãä¸ï¼æä»¬å¦å°äºæ±ç¼è¿ä¸ªå·¥å
·ï¼è¿æ¬¡æä»¬åæ¬¡è¯·åºæ±ç¼æ¥æ´æ·±å
¥å°ççsliceãå¦ææ²¡çè¿ä¸ç¯æç« ï¼å»ºè®®å
åå»çå®ï¼åç»§ç»é
è¯»æ¬ææææ´ä½³ã
å
æ¥ä¸å°æ®µç©å
·ä»£ç ï¼ä½¿ç¨Â make å
³é®åå建 sliceï¼
æ§è¡å¦ä¸å½ä»¤ï¼å¾å° Go æ±ç¼ä»£ç ï¼
æä»¬åªå ³æ³¨main彿°ï¼
å
说æä¸ä¸ï¼Go è¯è¨æ±ç¼Â FUNCDATA å PCDATA æ¯ç¼è¯å¨äº§ççï¼ç¨äºä¿åä¸äºåå徿¶éç¸å
³çä¿¡æ¯ï¼æä»¬å
ä¸ç¨ careã
以䏿±ç¼ä»£ç è¡æ°æ¯è¾å¤ï¼æ²¡å ³ç³»ï¼å 为å½ä»¤é½æ¯è¾ç®åï¼è䏿们ç Go æºç ä¹è¶³å¤ç®åï¼æ²¡æçç±ç䏿ç½ã
æä»¬å ä»ä¸å°ä¸æ«ä¸ç¼ï¼çå°å ä¸ªå ³é®å½æ°ï¼
| åºå· | åè½ |
| 1 | å建slice |
| 2 | ç±»åè½¬æ¢ |
| 3 | æå°å½æ° |
| 4 | æ ç©ºé´æ©å®¹ |
1æ¯å建 slice ç¸å
³çï¼2æ¯ç±»å转æ¢ï¼è°ç¨Â fmt.Printlnéè¦å° slice ä½ä¸ä¸ªè½¬æ¢ï¼Â 3æ¯æå°è¯å¥ï¼4æ¯æ ç©ºé´æ©å®¹å½æ°ï¼å¨å½æ°å¼å§å¤ï¼ä¼æ£æ¥å½åæ ç©ºé´æ¯å¦è¶³å¤ï¼ä¸å¤çè¯éè¦è°ç¨å®æ¥è¿è¡æ©å®¹ãææ¶å¯ä»¥å¿½ç¥ã
è°ç¨äºå½æ°å°±ä¼æ¶åå°åæ°ä¼ éï¼Go çåæ°ä¼ é齿¯éè¿ æ 空é´å®æçãæ¥ä¸æ¥ï¼æä»¬è¯¦ç»åæè¿æ´ä¸ªè¿ç¨ã
| è¡æ° | ä½ç¨ |
| 1 | main彿°å®ä¹ï¼æ 帧大å°ä¸ºÂ 96B |
| 2-4 | å¤ææ æ¯å¦éè¦è¿è¡æ©å®¹ï¼å¦æéè¦åè·³å°Â 228ï¼è¿éä¼è°ç¨Â runtime.morestack_noctxt(SB) è¿è¡æ æ©å®¹æä½ãå
·ä½ç»èåç»è¿ä¼ææç« æ¥è®² |
| 5-9 | å°Â caller BPÂ åæ ï¼å
·ä½ç»èåé¢ä¼è®²å° |
| 10-15 | è°ç¨Â runtime.makeslice(SB)Â å½æ°ååå¤å·¥ä½ã*_typeè¡¨ç¤ºçæ¯Â intï¼ä¹å°±æ¯Â slice å
ç´ çç±»åãè¿é对åºçæºç æ¯ç¬¬6è¡ï¼ä¹å°±æ¯è°ç¨Â make å建 slice çé£ä¸è¡ã5 å 10 åå«ä»£è¡¨é¿åº¦å容éï¼å½æ°åæ°ä¼å¨æ é¡¶åå¤å¥½ï¼ä¹åæ§è¡å½æ°è°ç¨å½ä»¤Â CALLï¼è¿å
¥å°è¢«è°ç¨å½æ°çæ 帧ï¼å°±ä¼æé¡ºåºä»Â callerÂ çæ é¡¶å彿°åæ° |
| 16-18 | æ¥æ¶Â makesliceçè¿åå¼ï¼éè¿Â move 移å¨å°å¯åå¨ä¸ |
| 19-21 | ç»æ°ç»ç´¢å¼å¼ä¸ºÂ 2 çå
ç´ èµä¸å¼Â 2ï¼å 为æ¯Â int åç sliceï¼å
ç´ å¤§å°ä¸º8åèï¼æä»¥Â MOVQ $2, 16(AX) æ¤å½ä»¤å°±æ¯å°Â 2 æ¬å°ç´¢å¼ä¸ºÂ 2 çä½ç½®ãè¿éè¿ä¼å¯¹ç´¢å¼å¼ç大å°è¿è¡æ£æ¥ï¼å¦æè¶çï¼åä¼è·³è½¬å°Â 221ï¼æ§è¡Â panicÂ å½æ° |
| 22-26 | åå«éè¿å¯åå¨Â AXï¼CXï¼DX å°Â makeslice çè¿åå¼Â move å°å
åçå
¶ä»ä½ç½®ï¼ä¹ç§°ä¸ºå±é¨åéï¼è¿æ ·å°±æé åºäºÂ slice |

å·¦è¾¹æ¯æ ä¸çæ°æ®ï¼å³è¾¹æ¯å ä¸çæ°æ®ãarray æå slice çåºå±æ°æ®ï¼è¢«åé
å°å ä¸äºã注æï¼æ ä¸çå°åæ¯ä»é«åä½å¢é¿ï¼å åä»ä½åé«å¢é¿ãæ å·¦è¾¹çæ°å表示对åºçæ±ç¼ä»£ç çè¡æ°ï¼æ å³è¾¹ç®å¤´å表示æ å°åãï¼48ï¼SPãï¼56ï¼SP 表示çå
容æ¥çå¾ä¸çã
注æï¼å¨å¾ä¸ï¼æ å°åæ¯ä»ä¸å¾ä¸å¢é¿ï¼æä»¥ SP è¡¨ç¤ºçæ¯å¾ä¸Â *_type æå¨çä½ç½®ï¼å
¶å®ç便¤ç±»æ¨ã
| è¡æ° | ä½ç¨ |
| 27-32 | åå¤è°ç¨Â runtime.convT2Eslice(SB)ç彿°åæ° |
| 33-36 | æ¥æ¶è¿åå¼ï¼éè¿AXï¼CXå¯åå¨Â move å°(48)SPãï¼56ï¼SP |
convT2Eslice ç彿°å£°æå¦ä¸ï¼
第ä¸ä¸ªåæ°æ¯æé *_typeï¼_typeæ¯ä¸ä¸ªè¡¨ç¤ºç±»åçç»æä½ï¼è¿éä¼ å
¥çå°±æ¯Â sliceçç±»å []intï¼ç¬¬äºä¸ªåæ°åæ¯å
ç´ çæéï¼è¿éä¼ å
¥çå°±æ¯Â slice åºå±æ°ç»çé¦å°åã
è¿åå¼Â eface çç»æä½å®ä¹å¦ä¸ï¼
ç±äºæä»¬ä¼è°ç¨Â fmt.Println(slice)ï¼çä¸å½æ°ååï¼
PrintlnÂ æ¥æ¶ interface ç±»åï¼å æ¤æä»¬éè¦å°Â sliceÂ è½¬æ¢æ interface ç±»åãç±äºÂ sliceÂ æ²¡ææ¹æ³ï¼æ¯ä¸ªâ空 interfaceâãå æ¤ä¼è°ç¨Â convT2EsliceÂ å®æè¿ä¸è½¬æ¢è¿ç¨ã
convT2EsliceÂ å½æ°è¿åçæ¯ç±»åæéåæ°æ®å°åãæºç å°±ä¸è´´äºï¼å¤§ä½æµç¨æ¯ï¼è°ç¨Â mallocgc åé
ä¸åå
åï¼ææ°æ®Â copy è¿å°æ°çå
åï¼ç¶åè¿åè¿åå
åçå°åï¼*_type åç´æ¥è¿åä¼ å
¥çåæ°ã

32(SP) å 40(SP) å
¶å®æ¯Â makesliceÂ å½æ°çè¿åå¼ï¼è¿éå¯ä»¥å¿½ç¥ã
è¿å©Â fmt.Println(slice) æåä¸ä¸ªå½æ°è°ç¨äºï¼æä»¬ç»§ç»ã
| è¡æ° | ä½ç¨ |
| 37-40 | åå¤Â PrintlnÂ å½æ°åæ°ãå
±3ä¸ªåæ°ï¼ç¬¬ä¸ä¸ªæ¯ç±»åå°åï¼è¿æä¸¤ä¸ªÂ 1ï¼è¿åææ¶è¿ä¸ç¥é为ä»ä¹è¦ä¼ ï¼æäºè§£çåå¦å¯ä»¥å¨æç« åé¢çè¨ |
æä»¥è°ç¨Â fmt.Println(slice) æ¶ï¼å®é
æ¯ä¼ å
¥äºä¸ä¸ªÂ sliceç±»åçefaceå°åãè¿æ ·ï¼Printlnå°±å¯ä»¥è®¿é®ç±»åä¸çæ°æ®ï¼æç»ç»âæå°âåºæ¥ã

æåï¼æä»¬çä¸Â mainÂ å½æ°æ 帧çå¼å§åæ¶å°¾é¨åã
BPå¯ä»¥ç解为ä¿åäºå½å彿°æ 帧æ åºçå°åï¼SPåä¿åæ é¡¶çå°åã
åå§ï¼BP å SP å嫿ä¸ä¸ªåå§ç¶æã
mainÂ å½æ°æ§è¡çæ¶åï¼å
æ ¹æ®Â mainÂ å½æ°æ 帧大å°ç¡®å®Â SPÂ çæ°æåï¼ä½¿å¾Â mainÂ å½æ°æ 帧大å°è¾¾å°Â 96Bãä¹åæèç BP ä¿åå°Â mainÂ å½æ°æ 帧çåºé¨ï¼å¹¶ä½¿Â BP å¯åå¨éæ°æåæ°çæ åºï¼ä¹å°±æ¯Â mainÂ å½æ°æ å¸§çæ åºã
æåï¼å½Â mainÂ å½æ°æ§è¡å®æ¯ï¼æå®æ åºç BP ç»åå¼¹åå°Â BP å¯åå¨ï¼æ¢å¤è°ç¨åçåå§ç¶æãä¸åé½åæ¯æ²¡æåç䏿 ·ï¼å®ç¾çç°åºã

è¿é¨åï¼å详ç»å°åæäºä¸é彿°è°ç¨çè¿ç¨ã䏿¹é¢ï¼è®©å¤§å®¶å¤ä¹ ä¸ä¸ä¸ä¸ç¯æç« 讲çå
容ï¼å¦ä¸æ¹é¢ï¼å大家å±ç¤ºå¦ä½æ¾å° Go ä¸çä¸ä¸ªå½æ°èåçå®è°ç¨äºåªäºå½æ°ãåä¾åä¸ï¼æä»¬å°±çå°äºÂ makeÂ å½æ°èåï¼å®é
䏿¯è°ç¨äºÂ makesliceÂ å½æ°ï¼è¿æä¸ç¹ï¼è®©å¤§å®¶å¯¹æ±ç¼ä¸é£ä¹âæ§æâï¼å¯ä»¥è½»æ¾å°åæä¸äºä¸è¥¿ã
æªå
æªå乿¯æ¯è¾å¸¸è§çä¸ç§å建 slice çæ¹æ³ï¼å¯ä»¥ä»æ°ç»æè slice ç´æ¥æªåï¼å½ç¶éè¦æå®èµ·æ¢ç´¢å¼ä½ç½®ã
åºäºå·²æ slice åå»ºæ° slice 对象ï¼è¢«ç§°ä¸ºÂ resliceãæ° slice åè slice å
±ç¨åºå±æ°ç»ï¼æ°è slice 对åºå±æ°ç»çæ´æ¹é½ä¼å½±åå°å½¼æ¤ãåºäºæ°ç»åå»ºçæ° slice å¯¹è±¡ä¹æ¯åæ ·çææï¼å¯¹æ°ç»æ slice å
ç´ ä½çæ´æ¹é½ä¼å½±åå°å½¼æ¤ã
å¼å¾æ³¨æçæ¯ï¼æ°è slice æè
æ° slice èæ°ç»äºç¸å½±åçåææ¯ä¸¤è
å
±ç¨åºå±æ°ç»ï¼å¦æå 为æ§è¡Â append æä½ä½¿å¾æ° slice åºå±æ°ç»æ©å®¹ï¼ç§»å¨å°äºæ°çä½ç½®ï¼ä¸¤è
å°±ä¸ä¼ç¸äºå½±åäºãæä»¥ï¼é®é¢çå
³é®å¨äºä¸¤è
æ¯å¦ä¼å
±ç¨åºå±æ°ç»ã
æªåæä½éç¨å¦ä¸æ¹å¼ï¼
对 data 使ç¨3个索å¼å¼ï¼æªååºæ°çsliceãè¿é data å¯ä»¥æ¯æ°ç»æè
 sliceãlowÂ æ¯æä½ç´¢å¼å¼ï¼è¿éæ¯éåºé´ï¼ä¹å°±æ¯è¯´ç¬¬ä¸ä¸ªå
ç´ æ¯Â data ä½äºÂ low 索å¼å¤çå
ç´ ï¼è high å maxÂ åæ¯å¼åºé´ï¼è¡¨ç¤ºæåä¸ä¸ªå
ç´ åªè½æ¯ç´¢å¼Â high-1 å¤çå
ç´ ï¼èæå¤§å®¹éååªè½æ¯ç´¢å¼Â max-1 å¤çå
ç´ ã
å½Â high == low æ¶ï¼æ°Â slice 为空ã
è¿æä¸ç¹ï¼high å max å¿
é¡»å¨èæ°ç»æè
è slice ç容éï¼capï¼èå´å
ã
æ¥çä¸ä¸ªä¾åï¼æ¥èªé¨ç大佬ãGoå¦ä¹ ç¬è®°ã第åçï¼P43页ï¼åèèµæéæå¼æºä¹¦ç±å°åãè¿éæä¼è¿è¡æ©å±ï¼å¹¶ä¼ä½è¯¦ç»è¯´æï¼
å çä¸ä»£ç è¿è¡çç»æï¼
æä»¬æ¥èµ°ä¸é代ç ï¼åå§ç¶æå¦ä¸ï¼
s1 ä»Â slice 索å¼2ï¼éåºé´ï¼å°ç´¢å¼5ï¼å¼åºé´ï¼å
ç´ çæ£åå°ç´¢å¼4ï¼ï¼é¿åº¦ä¸º3ï¼å®¹éé»è®¤å°æ°ç»ç»å°¾ï¼ä¸º8ã s2 ä»Â s1 çç´¢å¼2ï¼éåºé´ï¼å°ç´¢å¼6ï¼å¼åºé´ï¼å
ç´ çæ£åå°ç´¢å¼5ï¼ï¼å®¹éå°ç´¢å¼7ï¼å¼åºé´ï¼çæ£å°ç´¢å¼6ï¼ï¼ä¸º5ã

æ¥çï¼å s2 尾é¨è¿½å ä¸ä¸ªå
ç´ 100ï¼
s2 容éå好å¤ï¼ç´æ¥è¿½å ãä¸è¿ï¼è¿ä¼ä¿®æ¹åå§æ°ç»å¯¹åºä½ç½®çå
ç´ ãè¿ä¸æ¹å¨ï¼æ°ç»å s1 é½å¯ä»¥çå¾å°ã

忬¡å s2 追å å
ç´ 200ï¼
è¿æ¶ï¼s2 ç容éä¸å¤ç¨ï¼è¯¥æ©å®¹äºãäºæ¯ï¼s2 å¦èµ·çç¶ï¼å°åæ¥çå
ç´ å¤å¶æ°çä½ç½®ï¼æ©å¤§èªå·±ç容éãå¹¶ä¸ä¸ºäºåºå¯¹æªæ¥å¯è½ç append 带æ¥çå䏿¬¡æ©å®¹ï¼s2 ä¼å¨æ¤æ¬¡æ©å®¹çæ¶åå¤çä¸äºÂ bufferï¼å°æ°ç容éå°æ©å¤§ä¸ºåå§å®¹éç2åï¼ä¹å°±æ¯10äºã

æåï¼ä¿®æ¹Â s1 索å¼ä¸º2ä½ç½®çå
ç´ ï¼
è¿æ¬¡åªä¼å½±ååå§æ°ç»ç¸åºä½ç½®çå
ç´ ãå®å½±åä¸å°Â s2 äºï¼äººå®¶å·²ç»è¿èµ°é«é£äºã

åæä¸ç¹ï¼æå°Â s1Â çæ¶åï¼åªä¼æå°åºÂ s1 é¿åº¦ä»¥å
çå
ç´ ãæä»¥ï¼åªä¼æå°åº3个å
ç´ ï¼è½ç¶å®çåºå±æ°ç»ä¸æ¢3个å
ç´ ã
è³äºï¼æä»¬æ³å¨æ±ç¼å±é¢ççå°åºå®ä»¬æ¯å¦ä½å
±äº«åºå±æ°ç»çï¼éäºç¯å¹
ï¼è¿éä¸åå±å¼ãæå
´è¶£çåå¦å¯ä»¥å¨å
¬ä¼å·åå°åå¤ï¼åçæªåã
æä¼ç»ä½ 详ç»åæå½æ°è°ç¨å ³ç³»ï¼å¯¹å ±äº«åºå±æ°ç»çè¡ä¸ºä¹ä¼ä¸ç®äºç¶ã
slice åæ°ç»çåºå«å¨åª
slice çåºå±æ°æ®æ¯æ°ç»ï¼slice æ¯å¯¹æ°ç»çå°è£ ï¼å®æè¿°ä¸ä¸ªæ°ç»ççæ®µã两è é½å¯ä»¥éè¿ä¸æ æ¥è®¿é®å个å ç´ ã
æ°ç»æ¯å®é¿çï¼é¿åº¦å®ä¹å¥½ä¹åï¼ä¸è½åæ´æ¹ãå¨ Go ä¸ï¼æ°ç»æ¯ä¸å¸¸è§çï¼å 为å
¶é¿åº¦æ¯ç±»åçä¸é¨åï¼éå¶äºå®ç表达è½åï¼æ¯å¦Â [3]int å [4]int 就æ¯ä¸åçç±»åã
èåçåéå¸¸çµæ´»ï¼å®å¯ä»¥å¨æå°æ©å®¹ãåççç±»ååé¿åº¦æ å ³ã
append å°åºåäºä»ä¹
å
æ¥çç appendÂ å½æ°çååï¼
append 彿°çåæ°é¿åº¦å¯åï¼å æ¤å¯ä»¥è¿½å å¤ä¸ªå¼å° slice ä¸ï¼è¿å¯ä»¥ç¨Â ...Â ä¼ å
¥ sliceï¼ç´æ¥è¿½å ä¸ä¸ªåçã
append彿°è¿å弿¯ä¸ä¸ªæ°çsliceï¼Goç¼è¯å¨ä¸å
许è°ç¨äº append 彿°åä¸ä½¿ç¨è¿åå¼ã
æä»¥ä¸é¢çç¨æ³æ¯éçï¼ä¸è½ç¼è¯éè¿ã
ä½¿ç¨ append å¯ä»¥å slice 追å å
ç´ ï¼å®é
䏿¯å¾åºå±æ°ç»æ·»å å
ç´ ã使¯åºå±æ°ç»çé¿åº¦æ¯åºå®çï¼å¦æç´¢å¼Â len-1 ææåçå
ç´ å·²ç»æ¯åºå±æ°ç»çæåä¸ä¸ªå
ç´ ï¼å°±æ²¡æ³åæ·»å äºã
è¿æ¶ï¼slice ä¼è¿ç§»å°æ°çå
åä½ç½®ï¼æ°åºå±æ°ç»çé¿åº¦ä¹ä¼å¢å ï¼è¿æ ·å°±å¯ä»¥æ¾ç½®æ°å¢çå
ç´ ãåæ¶ï¼ä¸ºäºåºå¯¹æªæ¥å¯è½å次åçç append æä½ï¼æ°çåºå±æ°ç»çé¿åº¦ï¼ä¹å°±æ¯æ°Â slice ç容鿝çäºä¸å®ç buffer çãå¦åï¼æ¯æ¬¡æ·»å å
ç´ çæ¶åï¼é½ä¼åçè¿ç§»ï¼ææ¬å¤ªé«ã
æ° slice é¢çç bufferÂ å¤§å°æ¯æä¸å®è§å¾çãç½ä¸å¤§å¤æ°çæç« 齿¯è¿æ ·æè¿°çï¼
å½å slice 容éå°äºÂ
1024Â çæ¶åï¼æ° slice 容éåæåæ¥çÂ2 åï¼å slice 容éè¶ è¿Â1024ï¼æ° slice 容éåæåæ¥ç1.25åã
æå¨è¿éå
说ç»è®ºï¼ä»¥ä¸æè¿°æ¯é误çã
为äºè¯´æä¸é¢çè§å¾æ¯é误çï¼æåäºä¸å°æ®µç©å ·ä»£ç ï¼
æå
å建äºä¸ä¸ªç©ºç sliceï¼ç¶åï¼å¨ä¸ä¸ªå¾ªç¯é䏿å¾éé¢Â append æ°çå
ç´ ãç¶åè®°å½å®¹éçååï¼å¹¶ä¸æ¯å½å®¹éåçååçæ¶åï¼è®°å½ä¸èç容éï¼ä»¥åæ·»å å®å
ç´ ä¹åç容éï¼åæ¶è®°ä¸æ¤æ¶Â slice éçå
ç´ ãè¿æ ·ï¼æå°±å¯ä»¥è§å¯ï¼æ°è slice ç容éååæ
åµï¼ä»èæ¾åºè§å¾ã
è¿è¡ç»æï¼
å¨è slice 容éå°äº1024çæ¶åï¼æ° slice ç容éçç¡®æ¯è slice ç2åãç®åè¿ç®æ£ç¡®ã
使¯ï¼å½è slice 容é大äºçäºÂ 1024Â çæ¶åï¼æ
åµå°±æååäºãå½å slice 䏿·»å å
ç´ Â 1280Â çæ¶åï¼è slice ç容é为 1280ï¼ä¹ååæäºÂ 1696ï¼ä¸¤è
并䏿¯Â 1.25 åçå
³ç³»ï¼1696/1280=1.325ï¼ãæ·»å å®Â 1696 åï¼æ°ç容é 2304 å½ç¶ä¹ä¸æ¯Â 1696 ç 1.25 åã
å¯è§ï¼ç°å¨ç½ä¸åç§æç« ä¸çæ©å®¹çç¥å¹¶ä¸æ£ç¡®ãæä»¬ç´æ¥æ¬åºæºç ï¼æºç é¢åï¼äºæ ç§å¯ã
ä»å颿±ç¼ä»£ç æä»¬ä¹çå°äºï¼å slice 追å å
ç´ çæ¶åï¼è¥å®¹éä¸å¤ï¼ä¼è°ç¨Â growsliceÂ å½æ°ï¼æä»¥æä»¬ç´æ¥çå®ç代ç ã
çå°äºåï¼å¦æåªçååé¨åï¼ç°å¨ç½ä¸åç§æç« é说ç newcap çè§å¾æ¯å¯¹çãç°å®æ¯ï¼ååé¨åè¿å¯¹Â newcap ä½äºä¸ä¸ªå
å对é½ï¼è¿ä¸ªåå
ååé
çç¥ç¸å
³ãè¿è¡å
å对é½ä¹åï¼æ° slice ç容鿝è¦Â 大äºçäºÂ è slice 容éç 2åæè
1.25åã
ä¹åï¼å Go å å管çå¨ç³è¯·å åï¼å°è slice ä¸çæ°æ®å¤å¶è¿å»ï¼å¹¶ä¸å° append çå ç´ æ·»å å°æ°çåºå±æ°ç»ä¸ã
æåï¼å growsliceÂ å½æ°è°ç¨è
è¿åä¸ä¸ªæ°ç sliceï¼è¿ä¸ª slice çé¿åº¦å¹¶æ²¡æååï¼è容éå´å¢å¤§äºã
å
³äºÂ appendï¼æä»¬æåæ¥çä¸ä¸ªä¾åï¼æ¥æºäºåèèµæé¨åçãGolang Sliceçæ©å®¹è§åãã
è¿è¡ç»ææ¯ï¼
妿æç½ä¸åç§æç« ä¸æ»ç»ç飿 ·ï¼å°äºå slice é¿åº¦å°äº 1024 çæ¶åï¼å®¹éæ¯æ¬¡å¢å 1 åãæ·»å å ç´ 4 çæ¶åï¼å®¹éå为4ï¼æ·»å å ç´ 5 çæ¶åä¸åï¼æ·»å å ç´ 6 çæ¶å容éå¢å 1 åï¼åæ 8ã
é£ä¸é¢ä»£ç çè¿è¡ç»æå°±æ¯ï¼
è¿æ¯é误çï¼æä»¬æ¥ä»ç»ççï¼ä¸ºä»ä¹ä¼è¿æ ·ï¼å次æ¬åºä»£ç ï¼
è¿ä¸ªå½æ°ç忰便¬¡æ¯Â å
ç´ çç±»åï¼èç sliceï¼æ° slice æå°æ±ç容éã
ä¾åä¸Â sÂ åæ¥åªæ 2 个å
ç´ ï¼len å cap é½ä¸º 2ï¼append äºä¸ä¸ªå
ç´ åï¼é¿åº¦å为 3ï¼å®¹éæå°è¦åæ 5ï¼å³è°ç¨Â growsliceÂ å½æ°æ¶ï¼ä¼ å
¥ç第ä¸ä¸ªåæ°åºè¯¥ä¸º 5ãå³Â cap=5ãè䏿¹é¢ï¼doublecap æ¯å slice容éç 2 åï¼çäº 4ãæ»¡è¶³ç¬¬ä¸ä¸ªÂ if æ¡ä»¶ï¼æä»¥Â newcap åæäº 5ã
æ¥çè°ç¨äºÂ roundupsizeÂ å½æ°ï¼ä¼ å
¥ 40ãï¼ä»£ç ä¸ptrSizeæ¯æä¸ä¸ªæéç大å°ï¼å¨64使ºä¸æ¯8ï¼
æä»¬åçå
å对é½ï¼æ¬åºÂ roundupsizeÂ å½æ°ç代ç ï¼
徿æ¾ï¼æä»¬æç»å°è¿åè¿ä¸ªå¼åçç»æï¼
è¿æ¯Â Go æºç 䏿å
³å
ååé
ç两个 sliceãclass_to_sizeéè¿Â spanClassè·å spanååç object大å°ãè size_to_class8 表示éè¿Â size è·åå®ç spanClassã
æä»¬ä¼ è¿å»ç size çäº 40ãæä»¥Â (size+smallSizeDiv-1)/smallSizeDiv = 5ï¼è·å size_to_class8 æ°ç»ä¸ç´¢å¼ä¸ºÂ 5 çå
ç´ ä¸ºÂ 4ï¼è·å class_to_size ä¸ç´¢å¼ä¸ºÂ 4 çå
ç´ ä¸ºÂ 48ã
æç»ï¼æ°ç slice ç容é为 6ï¼
è³äºï¼ä¸é¢çä¸¤ä¸ªéæ³æ°ç»çç±æ¥ï¼ææ¶å°±ä¸å±å¼äºã
为ä»ä¹ nil slice å¯ä»¥ç´æ¥ append
å
¶å®Â nil slice æè
 empty sliceÂ é½æ¯å¯ä»¥éè¿è°ç¨ append 彿°æ¥è·å¾åºå±æ°ç»çæ©å®¹ãæç»é½æ¯è°ç¨Â mallocgc æ¥å Go çå
å管çå¨ç³è¯·å°ä¸åå
åï¼ç¶ååèµç»åæ¥çnil slice æÂ empty sliceï¼ç¶åæèº«ä¸åï¼æä¸ºâçæ£âç slice äºã
ä¼ slice å slice æéæä»ä¹åºå«
åé¢æä»¬è¯´å°ï¼slice å ¶å®æ¯ä¸ä¸ªç»æä½ï¼å å«äºä¸ä¸ªæåï¼len, cap, arrayãåå«è¡¨ç¤ºåçé¿åº¦ï¼å®¹éï¼åºå±æ°æ®çå°åã
å½ slice ä½ä¸ºå½æ°åæ°æ¶ï¼å°±æ¯ä¸ä¸ªæ®éçç»æä½ãå ¶å®å¾å¥½çè§£ï¼è¥ç´æ¥ä¼ sliceï¼å¨è°ç¨è çæ¥ï¼å®å slice å¹¶ä¸ä¼è¢«å½æ°ä¸çæä½æ¹åï¼è¥ä¼ çæ¯ slice çæéï¼å¨è°ç¨è çæ¥ï¼æ¯ä¼è¢«æ¹åå slice çã
å¼ç注æçæ¯ï¼ä¸ç®¡ä¼ çæ¯ slice è¿æ¯ slice æéï¼å¦ææ¹åäº slice åºå±æ°ç»çæ°æ®ï¼ä¼ååºå°å®å slice çåºå±æ°æ®ã为ä»ä¹è½æ¹ååºå±æ°ç»çæ°æ®ï¼å¾å¥½çè§£ï¼åºå±æ°æ®å¨ slice ç»æä½éæ¯ä¸ä¸ªæéï¼ä» 管 slice ç»æä½èªèº«ä¸ä¼è¢«æ¹åï¼ä¹å°±æ¯è¯´åºå±æ°æ®å°åä¸ä¼è¢«æ¹åã 使¯éè¿æååºå±æ°æ®çæéï¼å¯ä»¥æ¹ååççåºå±æ°æ®ï¼æ²¡æé®é¢ã
éè¿ slice ç array åæ®µå°±å¯ä»¥æ¿å°æ°ç»çå°åãå¨ä»£ç éï¼æ¯ç´æ¥éè¿ç±»ä¼¼Â s[i]=10 è¿ç§æä½æ¹å slice åºå±æ°ç»å
ç´ å¼ã
å¦å¤ï¼å°å¦ä¸å¥ï¼Go è¯è¨ç彿°åæ°ä¼ éï¼åªæå¼ä¼ éï¼æ²¡æå¼ç¨ä¼ éãåé¢ä¼ååä¸ç¯ç¸å ³çæç« ï¼æ¬è¯·æå¾ ã
忥çä¸ä¸ªå¹´å¹¼æ ç¥ç代ç çæ®µï¼
è¿è¡ä¸ä¸ï¼ç¨åºè¾åºï¼
æçæ¹åäºåå§ slice çåºå±æ°æ®ãè¿éä¼ éçæ¯ä¸ä¸ª slice ç坿¬ï¼å¨Â fÂ å½æ°ä¸ï¼sÂ åªæ¯Â mainÂ å½æ°ä¸Â s çä¸ä¸ªæ·è´ãå¨fÂ å½æ°å
é¨ï¼å¯¹Â s çä½ç¨å¹¶ä¸ä¼æ¹åå¤å±Â mainÂ å½æ°ç sã
è¦æ³ççæ¹åå¤å±Â sliceï¼åªæå°è¿åçæ°ç slice èµå¼å°åå§ sliceï¼æè
å彿°ä¼ éä¸ä¸ªæå slice çæéãæä»¬åæ¥çä¸ä¸ªä¾åï¼
è¿è¡ç»æï¼
// runtime/slice.go
type slice struct {
array unsafe.Pointer // å
ç´ æé
len int // é¿åº¦
cap int // 容é
}
package main
import "fmt"
func main() {
s1 := []int{0, 1, 2, 3, 8: 100}
fmt.Println(s1, len(s1), cap(s1))
}
[0 1 2 3 0 0 0 0 100] 9 9
package main
import "fmt"
func main() {
slice := make([]int, 5, 10) // é¿åº¦ä¸º5ï¼å®¹é为10
slice[2] = 2 // ç´¢å¼ä¸º2çå
ç´ èµå¼ä¸º2
fmt.Println(slice)
}
go tool compile -S main.go
0x0000 00000 (main.go:5)TEXT "".main(SB), $96-0
0x0000 00000 (main.go:5)MOVQ (TLS), CX
0x0009 00009 (main.go:5)CMPQ SP, 16(CX)
0x000d 00013 (main.go:5)JLS 228
0x0013 00019 (main.go:5)SUBQ $96, SP
0x0017 00023 (main.go:5)MOVQ BP, 88(SP)
0x001c 00028 (main.go:5)LEAQ 88(SP), BP
0x0021 00033 (main.go:5)FUNCDATA $0, gclocals·69c1753bd5f81501d95132d08af04464(SB)
0x0021 00033 (main.go:5)FUNCDATA $1, gclocals·57cc5e9a024203768cbab1c731570886(SB)
0x0021 00033 (main.go:5)LEAQ type.int(SB), AX
0x0028 00040 (main.go:6)MOVQ AX, (SP)
0x002c 00044 (main.go:6)MOVQ $5, 8(SP)
0x0035 00053 (main.go:6)MOVQ $10, 16(SP)
0x003e 00062 (main.go:6)PCDATA $0, $0
0x003e 00062 (main.go:6)CALL runtime.makeslice(SB)
0x0043 00067 (main.go:6)MOVQ 24(SP), AX
0x0048 00072 (main.go:6)MOVQ 32(SP), CX
0x004d 00077 (main.go:6)MOVQ 40(SP), DX
0x0052 00082 (main.go:7)CMPQ CX, $2
0x0056 00086 (main.go:7)JLS 221
0x005c 00092 (main.go:7)MOVQ $2, 16(AX)
0x0064 00100 (main.go:8)MOVQ AX, ""..autotmp_2+64(SP)
0x0069 00105 (main.go:8)MOVQ CX, ""..autotmp_2+72(SP)
0x006e 00110 (main.go:8)MOVQ DX, ""..autotmp_2+80(SP)
0x0073 00115 (main.go:8)MOVQ $0, ""..autotmp_1+48(SP)
0x007c 00124 (main.go:8)MOVQ $0, ""..autotmp_1+56(SP)
0x0085 00133 (main.go:8)LEAQ type.[]int(SB), AX
0x008c 00140 (main.go:8)MOVQ AX, (SP)
0x0090 00144 (main.go:8)LEAQ ""..autotmp_2+64(SP), AX
0x0095 00149 (main.go:8)MOVQ AX, 8(SP)
0x009a 00154 (main.go:8)PCDATA $0, $1
0x009a 00154 (main.go:8)CALL runtime.convT2Eslice(SB)
0x009f 00159 (main.go:8)MOVQ 16(SP), AX
0x00a4 00164 (main.go:8)MOVQ 24(SP), CX
0x00a9 00169 (main.go:8)MOVQ AX, ""..autotmp_1+48(SP)
0x00ae 00174 (main.go:8)MOVQ CX, ""..autotmp_1+56(SP)
0x00b3 00179 (main.go:8)LEAQ ""..autotmp_1+48(SP), AX
0x00b8 00184 (main.go:8)MOVQ AX, (SP)
0x00bc 00188 (main.go:8)MOVQ $1, 8(SP)
0x00c5 00197 (main.go:8)MOVQ $1, 16(SP)
0x00ce 00206 (main.go:8)PCDATA $0, $1
0x00ce 00206 (main.go:8)CALL fmt.Println(SB)
0x00d3 00211 (main.go:9)MOVQ 88(SP), BP
0x00d8 00216 (main.go:9)ADDQ $96, SP
0x00dc 00220 (main.go:9)RET
0x00dd 00221 (main.go:7)PCDATA $0, $0
0x00dd 00221 (main.go:7)CALL runtime.panicindex(SB)
0x00e2 00226 (main.go:7)UNDEF
0x00e4 00228 (main.go:7)NOP
0x00e4 00228 (main.go:5)PCDATA $0, $-1
0x00e4 00228 (main.go:5)CALL runtime.morestack_noctxt(SB)
0x00e9 00233 (main.go:5)JMP 0
CALL runtime.makeslice(SB)
CALL runtime.convT2Eslice(SB)
CALL fmt.Println(SB)
CALL runtime.morestack_noctxt(SB)
func convT2Eslice(t *_type, elem unsafe.Pointer) (e eface)
type eface struct {
_type *_type
data unsafe.Pointer
}
func Println(a ...interface{}) (n int, err error)
0x0013 00019 (main.go:5)SUBQ $96, SP
0x0017 00023 (main.go:5)MOVQ BP, 88(SP)
0x001c 00028 (main.go:5)LEAQ 88(SP), BP
â¦â¦â¦â¦â¦â¦â¦â¦â¦â¦
0x00d3 00211 (main.go:9)MOVQ 88(SP), BP
0x00d8 00216 (main.go:9)ADDQ $96, SP
RET
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
slice := data[2:4:6] // data[low, high, max]
max >= high >= low
package main
import "fmt"
func main() {
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := slice[2:5]
s2 := s1[2:6:7]
s2 = append(s2, 100)
s2 = append(s2, 200)
s1[2] = 20
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(slice)
}
[2 3 20]
[4 5 6 7 100 200]
[0 1 2 3 20 5 6 7 100 9]
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := slice[2:5]
s2 := s1[2:6:7]
s2 = append(s2, 100)
s2 = append(s2, 100)
s1[2] = 20
func append(slice []Type, elems ...Type) []Type
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
append(slice, elem1, elem2)
append(slice, anotherSlice...)
package main
import "fmt"
func main() {
s := make([]int, 0)
oldCap := cap(s)
for i := 0; i < 2048; i++ {
s = append(s, i)
newCap := cap(s)
if newCap != oldCap {
fmt.Printf("[%d -> %4d] cap = %-4d | after append %-4d cap = %-4d\n", 0, i-1, oldCap, i, newCap)
oldCap = newCap
}
}
}
[0 -> -1] cap = 0 | after append 0 cap = 1
[0 -> 0] cap = 1 | after append 1 cap = 2
[0 -> 1] cap = 2 | after append 2 cap = 4
[0 -> 3] cap = 4 | after append 4 cap = 8
[0 -> 7] cap = 8 | after append 8 cap = 16
[0 -> 15] cap = 16 | after append 16 cap = 32
[0 -> 31] cap = 32 | after append 32 cap = 64
[0 -> 63] cap = 64 | after append 64 cap = 128
[0 -> 127] cap = 128 | after append 128 cap = 256
[0 -> 255] cap = 256 | after append 256 cap = 512
[0 -> 511] cap = 512 | after append 512 cap = 1024
[0 -> 1023] cap = 1024 | after append 1024 cap = 1280
[0 -> 1279] cap = 1280 | after append 1280 cap = 1696
[0 -> 1695] cap = 1696 | after append 1696 cap = 2304
// go 1.9.5 src/runtime/slice.go:82
func growslice(et *_type, old slice, cap int) slice {
// â¦â¦
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
newcap = cap
} else {
if old.len < 1024 {
newcap = doublecap
} else {
for newcap < cap {
newcap += newcap / 4
}
}
}
// â¦â¦
capmem = roundupsize(uintptr(newcap) * ptrSize)
newcap = int(capmem / ptrSize)
}
package main
import "fmt"
func main() {
s := []int{1,2}
s = append(s,4,5,6)
fmt.Printf("len=%d, cap=%d",len(s),cap(s))
}
len=5, cap=6
len=5, cap=8
// go 1.9.5 src/runtime/slice.go:82
func growslice(et *_type, old slice, cap int) slice {
// â¦â¦
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
newcap = cap
} else {
// â¦â¦
}
// â¦â¦
capmem = roundupsize(uintptr(newcap) * ptrSize)
newcap = int(capmem / ptrSize)
}
// src/runtime/msize.go:13
func roundupsize(size uintptr) uintptr {
if size < _MaxSmallSize {
if size <= smallSizeMax-8 {
return uintptr(class_to_size[size_to_class8[(size+smallSizeDiv-1)/smallSizeDiv]])
} else {
//â¦â¦
}
}
//â¦â¦
}
const _MaxSmallSize = 32768
const smallSizeMax = 1024
const smallSizeDiv = 8
class_to_size[size_to_class8[(size+smallSizeDiv-1)/smallSizeDiv]]
var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}
var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768}
newcap = int(capmem / ptrSize) // 6
package main
func main() {
s := []int{1, 1, 1}
f(s)
fmt.Println(s)
}
func f(s []int) {
// iåªæ¯ä¸ä¸ªå¯æ¬ï¼ä¸è½æ¹åsä¸å
ç´ çå¼
/*for _, i := range s {
i++
}
*/
for i := range s {
s[i] += 1
}
}
[2 2 2]
package main
import "fmt"
func myAppend(s []int) []int {
// è¿é s è½ç¶æ¹åäºï¼ä½å¹¶ä¸ä¼å½±åå¤å±å½æ°ç s
s = append(s, 100)
return s
}
func myAppendPtr(s *[]int) {
// 伿¹åå¤å± s æ¬èº«
*s = append(*s, 100)
return
}
func main() {
s := []int{1, 1, 1}
newS := myAppend(s)
fmt.Println(s)
fmt.Println(newS)
s = newS
myAppendPtr(&s)
fmt.Println(s)
}
[1 1 1]
[1 1 1 100]
[1 1 1 100 100][1 1 1 100 100]
myAppendÂ å½æ°éï¼è½ç¶æ¹åäºÂ sï¼ä½å®åªæ¯ä¸ä¸ªå¼ä¼ éï¼å¹¶ä¸ä¼å½±åå¤å±ç sï¼å æ¤ç¬¬ä¸è¡æå°åºæ¥çç»æä»ç¶æ¯Â [1 1 1]ã
è newS æ¯ä¸ä¸ªæ°ç sliceï¼å®æ¯åºäºÂ s å¾å°çãå æ¤å®æå°çæ¯è¿½å äºä¸ä¸ªÂ 100 ä¹åçç»æï¼Â [1 1 1 100]ã
æåï¼å°Â newS èµå¼ç»äºÂ sï¼sÂ è¿æ¶æçæ£åæäºä¸ä¸ªæ°çsliceãä¹åï¼åç»Â myAppendPtrÂ å½æ°ä¼ å
¥ä¸ä¸ªÂ s æéï¼è¿åå®çç被æ¹åäºï¼[1 1 1 100 100]ã
æ»ç»
å°æ¤ï¼å
³äºÂ slice çé¨å就讲å®äºï¼ä¸ç¥å¤§å®¶ææ²¡æçè¿ç¾ãæä»¬æåæ¥æ»ç»ä¸ä¸ï¼
â¢åçæ¯å¯¹åºå±æ°ç»çä¸ä¸ªæ½è±¡ï¼æè¿°äºå®çä¸ä¸ªç段ãâ¢åçå®é
䏿¯ä¸ä¸ªç»æä½ï¼å®æä¸ä¸ªå段ï¼é¿åº¦ï¼å®¹éï¼åºå±æ°æ®çå°åãâ¢å¤ä¸ªåçå¯è½å
±äº«åä¸ä¸ªåºå±æ°ç»ï¼è¿ç§æ
åµä¸ï¼å¯¹å
¶ä¸ä¸ä¸ªåçæè
åºå±æ°ç»çæ´æ¹ï¼ä¼å½±åå°å
¶ä»åçãâ¢appendÂ å½æ°ä¼å¨åç容éä¸å¤çæ
åµä¸ï¼è°ç¨Â growsliceÂ å½æ°è·åæéè¦çå
åï¼è¿ç§°ä¸ºæ©å®¹ï¼æ©å®¹ä¼æ¹åå
ç´ åæ¥çä½ç½®ãâ¢æ©å®¹çç¥å¹¶ä¸æ¯ç®åçæ©ä¸ºååç容éç 2 åæÂ 1.25 åï¼è¿æå
å对é½çæä½ãæ©å®¹åç容é >= å容éç 2 åæÂ 1.25 åãâ¢å½ç´æ¥ç¨åçä½ä¸ºå½æ°åæ°æ¶ï¼å¯ä»¥æ¹ååççå
ç´ ï¼ä¸è½æ¹ååçæ¬èº«ï¼æ³è¦æ¹ååçæ¬èº«ï¼å¯ä»¥å°æ¹ååçåçè¿åï¼å½æ°è°ç¨è
æ¥æ¶æ¹ååçåçæè
å°åçæéä½ä¸ºå½æ°åæ°ã
åèèµæ
ãç æ´ã深度解æ Go è¯è¨ä¸ãåçãçä¸ç§ç¹æ®ç¶æããhttps://juejin.im/post/5bea58df6fb9a049f153bca8
ãèé± æ°ç»ãhttps://juejin.im/post/5be53bc251882516c15af2e0
ãèé± åçãhttps://juejin.im/post/5be8e0b1f265da614d08b45a
ãgolang interfaceæºç ãhttps://i6448038.github.io/2018/10/01/Golang-interface/
ãgolang interfaceæºç ãhttp://legendtkl.com/2017/07/01/golang-interface-implement/
ãinterfaceãhttps://www.jishuwen.com/d/2C9z#tuit
ãé¨ç弿ºGoå¦ä¹ ç¬è®°ãhttps://github.com/qyuhen/book
ãslice å¾å¾æ¼äº®ãhttps://halfrost.com/go_slice/
ãGolang Sliceçæ©å®¹è§åãhttps://jodezer.github.io/2017/05/golangSlice%E7%9A%84%E6%89%A9%E5%AE%B9%E8%A7%84%E5%88%99
ãsliceä½ä¸ºåæ°ãhttps://www.cnblogs.com/fwdqxl/p/9317769.html
ãæºç ãhttps://ictar.xyz/2018/10/25/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA-go-slice/
ãappendæºå¶ è¯æãhttps://brantou.github.io/2017/05/24/go-array-slice-string/
ãslice æ±ç¼ãhttp://xargin.com/go-slice/
ãslice tricksãhttps://colobu.com/2017/03/22/Slice-Tricks/
ãæå¾ãhttps://i6448038.github.io/2018/08/11/array-and-slice-principle/
ãsliceçæ¬è´¨ãhttps://www.flysnow.org/2018/12/21/golang-sliceheader.html
ãsliceä½¿ç¨æå·§ãhttps://blog.thinkeridea.com/201901/go/slice_de_yi_xie_shi_yong_ji_qiao.html
ãslice/arrayãå
åå¢é¿ãhttps://blog.thinkeridea.com/201901/go/shen_ru_pou_xi_slice_he_array.html
æåï¼å¦æä½ è§å¾æ¬æå¯¹ä½ æå¸®å©çè¯ï¼å¸®æç¹ä¸ä¸Â å¨ç æè
转åå°æååï¼ååéè¦ä½ çé¼å±åæ¯æï¼æè°¢ï¼

4万+

被折叠的 条评论
为什么被折叠?



