ä¸å¨å æä¸ï¼æåå äºâGoå¤è¯»âæ´»å¨ï¼è¿æ主è¦è®²Goæ±ç¼è¯è¨ï¼ç±æ»´æ»´æ¹æ¥æ大ç¥ä¸»è®²ãæ´»å¨ç»æåï¼ææè§æéäºä»»ç£äºèãæ´»å¨ä»æä¸9ç¹å°æ·±å¤11ç¹å¤ï¼å ¨ç¨æ·±åº¦åä¸ï¼å¤§å¼è¿ç¾ï¼ä»¥è³äºæ´»å¨ç»æä¹åï¼ä¹ ä¹ ä¸è½å¹³éã
å¯ä»¥è¯´ç解äºGoæ±ç¼è¯è¨ï¼å°±å¯ä»¥è®©æ们对Goçç解ä¸ä¸ä¸ªå°é¶ï¼å¾å¤ä»¥å模棱çä¸è¥¿ï¼å¨æ±ç¼è¯è¨é¢åé½æ æéå½¢äºãæå¨æ´»å¨ä¸æ¶è·äºå¾å¤ï¼ä»å¤©ææ¥ä½ä¸ä¸ªæ»ç»ï¼å¸æç»å¤§å®¶å¸¦æ¥å¯åï¼
为äºæ´å¥½çé 读ä½éªï¼æå¨è´´ä¸æç« ç®å½ï¼
ç¼èµ·
å å¨åæåäºä¸ç¯å
³äºdefer
çæç« ï¼ãGolangä¹å¦ä½è½»æ¾å解deferç温æé·é±ããè¿ç¯æç« ååºåä¸ä¹
就被GoCN
çæ¯æ¥æ°é»æ¶å½äºï¼ç¶å就被Goå¤è¯»ç¾¤ç大佬æ¨æçå°äºï¼ä¹å被é请å»å¤è¯»æ´»å¨å享ã
æ£å¼å享åï¼æå主é¢é 读äºå¾å¤æç« ï¼ä»¥æ±ædeferè®²æ¸ æ¥ãé 读è¿ç¨ä¸ï¼æåç°ä½å¡æ·±å ¥ä¸ç¹çæç« ï¼é½ä¼æåºGoæ±ç¼è¯è¨ãäºæ¯å°±å»æç´¢èµæï¼æ å¥ç¸å ³çèµæ太å°ï¼çå¾äºéé¾éï¼æåå°äºçæ£è¦å享çæ¶åä¹æ²¡æå®å ¨å¼æ¸ æ¥ã
å¤è¯»æ´»å¨ç»æä¹åï¼æ¨å¤§åå¸äºç±æ¥æ大ç¥å¸¦æ¥çå¤è¯»å享é¢åï¼ãplan9 æ±ç¼å
¥é¨ï¼å¸¦ä½ æéåºç¨ååºå±ã
ãæå¾ç¥è¿ä¸ªæ¶æ¯åï¼é常æ¿å¨ï¼ç»äºæç人å¯ä»¥è®²è®²Goæ±ç¼è¯è¨äºï¼å¬å®ä¹å估计ä¼æå¾å¤§æåï¼ä¹è½æædeferçåºå±åçäºï¼
æ¥çï¼æåç°ï¼æ¥æ大ç¥ç«ç¶åæå¨åä¸ä¸ªå ¬å¸ï¼æå¨å ¬å¸å ç½ä¸æå°äºä»åçplan9æ±ç¼ç¸å ³æç« ï¼åå¸å°Goå¤è¯»çgithubä¸ãææåè±æ¶é´é¢ä¹ å®äºæç« ï¼æ´çåºäºéå°çé®é¢ã
å¨å æä¸9ç¹åæ¶å¼è®²ï¼æ¹å¤§çåå¤å¾å åï¼åæ¥1个å°æ¶çæ¶é´è¢«æé¿å°äº2个å¤å°æ¶ï¼èæ¹å¤§ç²¾ååååºä¸ç´å¾è¿ éï¼é®çé®é¢å¾å¿«å°±è½å¾å°åçãæå ¨ç¨åæ¹å¤§ç´æ¥å¯¹è¯ï¼æè§ç®ç´ä¸è¦å¤ªç½ï¼
è¿ç¯æç« æ¢æ¯å¯¹è¿æ¬¡å¤è¯»çæ»ç»ï¼ä¹æ¯ä¸ºäºå®£ä¼ ä¸ä¸Goå¤è¯»æ´»å¨ãé£éæ¯ä¸ç¾¤æ追æ±ç人ï¼ä»ä»¬æ¯å¨é½ä¼èå¨ä¸èµ·ï¼éè¿ç½ç»ï¼æ¢è®¨Goè¯è¨çæ¹æ¹é¢é¢ãæç¸ä¿¡ï¼åä¸ç人é½ä¼æå¾å¤ä¸åçæ¶è·ã
æç´æ¥åä¸çGoå¤è¯»æ´»å¨æä¸æï¼ä¸æå享ï¼ä¸¤æå¬è®²ï¼æ¯æ¬¡é½æå¾å¤çæ¶è·ã
èªæä»ç»çæå·§
å¾å¤äººé½ä¸ç¥éæä¹å好ä¸ä¸ªèªæä»ç»ï¼è¦ä¹å«ç³å ¶è¾ï¼ä»ç»å®å¤§å®¶é½ä¸ç¥éä½ è®²äºä»ä¹ï¼è¦ä¹è¯´äºå天æ æçä¿¡æ¯ï¼å¤§å®¶å¹¶ä¸å ³å¿çäºæ ï¼æå¾å¾å°´å°¬ã å ¶å®èªæä»ç»æ²¡é£ä¹é¾ï¼ææ¡å¥è·¯åï¼æ¯å¯ä»¥åå¾å¾å¥½çï¼
æå¨ä¸ä¸æGoå¤è¯»å享çæ¶åï¼ç¨ä¸å¼ PPTå®æäºèªæä»ç»ãå
å«äºå个æ¹é¢ï¼ä¸ªäººåºæ¬ä¿¡æ¯
ãåºç°å¨æ¤æ¶æ¤å°çåå
ãæè½å¸¦æ¥ç帮å©
ãæå¸æå¾å°ç帮å©
ã
个人åºæ¬ä¿¡æ¯
å
æ¬ä½ å«ä»ä¹ååï¼æ¯åªé人ï¼å¨ä»ä¹å°æ¹å·¥ä½ï¼æ¯ä¸äºåªä¸ªå¦æ ¡ï¼æä»ä¹å
´è¶£ç±å¥½â¦â¦è¿äºåºæ¬çå±æ§ãè¿äºä¿¡æ¯å¯ä»¥è®©å¤§å®¶å¿«éå½¢æå¯¹ä½ çç´è§è®¤è¯ã
åºç°å¨æ¤æ¶æ¤å°çåå
ï¼å¯ä»¥è®²è§£ä½ çæ
äºãä½ å¨ä»ä¹å°æ¹éè¿ä»ä¹äººç¥éäºè¿ä¸ªæ´»å¨ï¼ç¶åå 为ä»ä¹æå¨ä½ æ¥åå â¦â¦éè¿æ
äºå¯ä»¥è¿
éæè¿ä¸ç°åºå
¶ä»åä¸è
çè·ç¦»ã
æè½å¸¦æ¥ç帮å©
ï¼åå æ´»å¨ç人é½æ¯æ³è·åä¸äºä¸è¥¿çï¼ç¥è¯ãç»éªãè§é»ççãä½æ¯ï¼æ们ä¸è½åªç´¢åï¼ä¸ä»åºãå æ¤ï¼å¯ä»¥è®²è®²ä½ å¯ä»¥æä¾ç帮å©ãæ¯å¦æå¯ä»¥èç³»åºå°ï¼æä¼åå®£ä¼ æç« ççï¼ä½ å¯ä»¥è®²åºä½ ç¬ç¹çä»·å¼ã
æå¸æå¾å°ç帮å©
ãæ¯ä¸ªåä¸ç人é½å¸æä»æ´»å¨ä¸è·å¾èªå·±æ³è¦çä¸è¥¿ï¼æ£æ¯å 为æ¤ï¼è¿ä¸ªæ´»å¨å¯¹äºåä¸è
æææä¹ï¼ä¹æä¼æç»ä¸å»çå¨åã
è¿å个æ¹é¢ï¼å¯ä»¥ç»æä¸ä¸ªé常精彩çèªæä»ç»ãå®ææ©æ¯æå¨å¬ç½èçãç½è¾æç»´ãå¬å°çï¼ææå®åè¿äºæç人çç®æ³
éï¼ä»å¤©æ¨èç»å¤§å®¶ãå¸æ大家以åå¨éè¦èªæä»ç»çåºåæè¯å¯è¯´ï¼èä¸è½è¯´ç精彩ã
ç¡¬æ ¸ç¥è¯ç¹
ä»ä¹æ¯plan9æ±ç¼
æ们ç¥éï¼CPUæ¯åªè®¤äºè¿å¶æ令çï¼ä¹å°±æ¯ä¸ä¸²ç0101ï¼äººç±»æ æ³è®°ä½è¿äºäºè¿å¶ç ï¼äºæ¯åæäºæ±ç¼è¯è¨ãæ±ç¼è¯è¨å®é ä¸æ¯äºè¿å¶æ令çææ¬å½¢å¼ï¼å®ä¸æ令å¯ä»¥ä¸ä¸å¯¹åºã
æ¯ä¸ç§CPUæ令é½æ¯ä¸ä¸æ ·çï¼å æ¤å¯¹åºçæ±ç¼è¯è¨ä¹å°±ä¸ä¸æ ·ã人类åå®æ±ç¼è¯è¨åï¼æå®è½¬æ¢æäºè¿å¶ç ï¼å°±å¯ä»¥è¢«æºå¨æ§è¡äºã转æ¢çå¨ä½ç±ç¼è¯å¨å®æã
Goè¯è¨çç¼è¯å¨åæ±ç¼å¨é½å¸¦äºä¸ä¸ª-Såæ°ï¼å¯ä»¥æ¥ççæçæç»ç®æ 代ç ãéè¿å¯¹æ¯ç®æ 代ç ååå§çGoè¯è¨æGoæ±ç¼è¯è¨ä»£ç çå·®å¼å¯ä»¥å 深对åºå±å®ç°çç解ã
Goæ±ç¼è¯è¨å®é ä¸æ¥æºäºplan9æ±ç¼è¯è¨ï¼èplan9æ±ç¼è¯è¨æåæ¥æºäºGoè¯è¨ä½è ä¹ä¸çKen Thompson为plan9ç³»ç»æåçCè¯è¨ç¼è¯å¨è¾åºçæ±ç¼ä¼ªä»£ç ãè¿é强çæ¨èä¸ä¸æ¥æ大ç¥çæ°ä¹¦ãGoè¯è¨é«çº§ç¼ç¨ãï¼å³å°ä¸å¸ï¼çµåççç¹å»é 读åæå¯ä»¥çå°å°åï¼ä¹¦ä¸æä¸æ´ä¸ªç« è讲Goçæ±ç¼è¯è¨ï¼é常精彩ï¼
ç解Goçæ±ç¼è¯è¨ï¼åªæåªæ¯ä¸ç¹ç¹ï¼é½è½å¯¹Goçè¿è¡æºå¶ææ´æ·±å ¥çç解ãæ¯å¦æ们以å讲çdeferï¼å¦æä»Goæºç ç¼è¯åçæ±ç¼ä»£ç æ¥çï¼å°±è½æ·±å»å°ææ¡å®çåºå±åçãåæ¯å¦ï¼å¾å¤æç« é½ä¼åæGoçå½æ°åæ°ä¼ éé½æ¯å¼ä¼ éï¼å¦æææ±ç¼ä»£ç ç§åºæ¥ï¼å¾å®¹æå°±è½å¾åºç»è®ºã
æ±ç¼è§åº¦çå½æ°è°ç¨åè¿åè¿ç¨
å设æ们æä¸ä¸ªè¿æ ·å¹´å¹¼æ ç¥çä¾åï¼æ±ä¸¤ä¸ªintçåï¼Goæºç å¦ä¸ï¼
package main
func main() {
_ = add(3,5)
}
func add(a, b int) int {
return a+b
}
使ç¨å¦ä¸å½ä»¤å¾å°æ±ç¼ä»£ç ï¼
go tool compile -S main.go
go tool compile
å½ä»¤ç¨äºè°ç¨Goè¯è¨æä¾çåºå±å½ä»¤å·¥å
·ï¼å
¶ä¸-S
åæ°è¡¨ç¤ºè¾åºæ±ç¼æ ¼å¼ã
æ们ç°å¨åªå ³å¿addå½æ°çæ±ç¼ä»£ç ï¼
"".add STEXT nosplit size=19 args=0x18 locals=0x0
0x0000 00000 (main.go:7) TEXT "".add(SB), NOSPLIT, $0-24
0x0000 00000 (main.go:7) FUNCDATA $0, gclocals·54241e171da8af6ae173d69da0236748(SB)
0x0000 00000 (main.go:7) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (main.go:7) MOVQ "".b+16(SP), AX
0x0005 00005 (main.go:7) MOVQ "".a+8(SP), CX
0x000a 00010 (main.go:8) ADDQ CX, AX
0x000d 00013 (main.go:8) MOVQ AX, "".~r2+24(SP)
0x0012 00018 (main.go:8) RET
çä¸ææ²¡å ³ç³»ï¼æç®åä¹ä¸æ¯å ¨é¨é½æï¼ä½æ¯å¯¹äºç解ä¸ä¸ªå½æ°è°ç¨çæ´ä½è¿ç¨èè¨ï¼è¶³å¤äºã
è¿ä¸è¡è¡¨ç¤ºå®ä¹add
è¿ä¸ªå½æ°ï¼æåçæ°å$0-24
ï¼å
¶ä¸0
表示å½æ°æ 帧大å°ä¸º0ï¼24
表示åæ°åè¿åå¼ç大å°ï¼åæ°æ¯2个intååéï¼è¿åå¼æ¯1个intååéï¼å
±24åèã
åçä¸é´è¿åè¡ï¼
代ç ç段ä¸ç第1è¡ï¼å°ç¬¬2个åæ°b
æ¬å°AX
å¯åå¨ï¼ç¬¬2è¡å°1个åæ°a
æ¬å°å¯åå¨CX
ï¼ç¬¬3è¡å°a
åb
ç¸å ï¼ç¸å çç»ææ¬å°AX
ï¼æåä¸è¡ï¼å°ç»ææ¬å°è¿ååæ°çå°åï¼è¿æ®µæ±ç¼ä»£ç é常ç®åï¼æ¥çä¸ä¸å½æ°è°ç¨è
å被è°è
çæ 帧å¾ï¼
(SP)ææ 顶ï¼b+16(SP)表示裸éª1çä½ç½®ï¼ä»SPå¾ä¸å¢å 16个åèï¼æ³¨æï¼åé¢çbä» è¡¨ç¤ºä¸ä¸ªæ å·ï¼åæ ·ï¼a+8(SP)表示å®å0ï¼~r2+24(SP)å表示è¿åå¼çä½ç½®ã
å ·ä½å¯ä»¥çä¸é¢çå¾ï¼
ä¸é¢addå½æ°çæ 帧大å°ä¸º0ï¼å ¶å®æ´ä¸è¬çè°ç¨è ä¸è¢«è°ç¨è çæ 帧示æå¾å¦ä¸ï¼
æåï¼æ§è¡RET
æ令ãè¿ä¸æ¥æ被è°ç¨å½æ°add
æ 帧æ¸
é¶,æ¥çï¼å¼¹åºæ 顶çè¿åå°å
ï¼æå®èµç»æ令å¯åå¨rip
ï¼èè¿åå°å
å°±æ¯main
å½æ°éè°ç¨add
å½æ°çä¸ä¸è¡ã
äºæ¯ï¼ååå°äºmain
å½æ°çæ§è¡ç¯å¢ï¼add
å½æ°çæ 帧ä¹è¢«éæ¯äºãä½æ¯æ³¨æï¼è¿åå
åæ¯æ²¡æ被æ¸
é¶çï¼æ¸
é¶å¨ä½æ¯ä¹åå次ç³è¯·è¿åå
åçæ¶åè¦åçäºãæ¯å¦ï¼å£°æäºä¸ä¸ªintååéï¼å®çé»è®¤å¼æ¯0ï¼æ¸
é¶çå¨ä½æ¯å¨è¿éå®æçã
è¿æ ·ï¼mainå½æ°å®æäºå½æ°è°ç¨ï¼ä¹æ¿å°äºè¿åå¼ï¼å®ç¾ã
æ±ç¼è§åº¦çslice
åæ¥çä¸ä¸ªä¾åï¼æ们æ¥ççslice
çåºå±å°åºæ¯ä»ä¹ã
package main
func main() {
s := make([]int, 3, 10)
_ = f(s)
}
func f(s []int) int {
return s[1]
}
ç¨ä¸é¢åæ ·çå½ä»¤å¾å°æ±ç¼ä»£ç ï¼æ们åªå
³æ³¨f
å½æ°çæ±ç¼ä»£ç ï¼
0x0000 00000 (main.go:7) TEXT "".add(SB), NOSPLIT, $0-24
0x0000 00000 (main.go:7) MOVQ "".b+16(SP), AX
0x0005 00005 (main.go:7) MOVQ "".a+8(SP), CX
0x000a 00010 (main.go:8) ADDQ CX, AX
0x000d 00013 (main.go:8) MOVQ AX, "".~r2+24(SP)
"".f STEXT nosplit size=53 args=0x20 locals=0x8
// æ 帧大å°ä¸º8åèï¼åæ°åè¿åå¼ä¸º32åè
0x0000 00000 (main.go:8) TEXT "".f(SB), NOSPLIT, $8-32
// SPæ 顶æéä¸ç§»8åè
0x0000 00000 (main.go:8) SUBQ $8, SP
// å°BPå¯åå¨çå¼å
¥æ
0x0004 00004 (main.go:8) MOVQ BP, (SP)
// å°æ°çæ 顶å°åä¿åå°BPå¯åå¨
0x0008 00008 (main.go:8) LEAQ (SP), BP
0x000c 00012 (main.go:8) FUNCDATA $0, gclocals·4032f753396f2012ad1784f398b170f4(SB)
0x000c 00012 (main.go:8) FUNCDATA $1, gclocals·69c1753bd5f81501d95132d08af04464(SB)
// ååºsliceçé¿åº¦len
0x000c 00012 (main.go:8) MOVQ "".s+24(SP), AX
// æ¯è¾ç´¢å¼1æ¯å¦è¶
è¿len
0x0011 00017 (main.go:9) CMPQ AX, $1
// å¦æè¶
è¿lenï¼è¶çäºã跳转å°46
0x0015 00021 (main.go:9) JLS 46
// å°sliceçæ°æ®é¦å°åå è½½å°AXå¯åå¨
0x0017 00023 (main.go:9) MOVQ "".s+16(SP), AX
// å°ç¬¬8byteå°åçå
ç´ ä¿åå°AXå¯åå¨ï¼ä¹å°±æ¯salaries[1]
0x001c 00028 (main.go:9) MOVQ 8(AX), AX
// å°ç»ææ·è´å°è¿ååæ°çä½ç½®ï¼yï¼
0x0020 00032 (main.go:9) MOVQ AX, "".~r1+40(SP)
// æ¢å¤BPçå¼
0x0025 00037 (main.go:9) MOVQ (SP), BP
// SPåä¸ç§»å¨8个åè
0x0029 00041 (main.go:9) ADDQ $8, SP
// è¿å
0x002d 00045 (main.go:9) RET
0x002e 00046 (main.go:9) PCDATA $0, $1
// è¶çï¼panic
0x002e 00046 (main.go:9) CALL runtime.panicindex(SB)
0x0033 00051 (main.go:9) UNDEF
0x0000 48 83 ec 08 48 89 2c 24 48 8d 2c 24 48 8b 44 24 H...H.,$H.,$H.D$
0x0010 18 48 83 f8 01 76 17 48 8b 44 24 10 48 8b 40 08 .H...v.H.D$.H.@.
0x0020 48 89 44 24 28 48 8b 2c 24 48 83 c4 08 c3 e8 00 H.D$(H.,$H......
0x0030 00 00 00 0f 0b .....
rel 47+4 t=8 runtime.panicindex+0 rel 47+4 t=8 runtime.panicindex+0
â
éè¿ä¸é¢çæ±ç¼ä»£ç ï¼æ们ç»åºå½æ°è°ç¨çæ 帧å¾ï¼
æ们å¯ä»¥æ¸ æ°å°çå°ï¼ä¸ä¸ªsliceæ¬è´¨ä¸æ¯ç¨ä¸ä¸ªæ°æ®é¦å°åï¼ä¸ä¸ªé¿åº¦Lenï¼ä¸ä¸ªå®¹éCapãæ以å¨åæ°æ¯sliceçå½æ°éï¼å¯¹sliceçæä½ä¼å½±åå°å®åçsliceã
æ£ç¡®åä¸Goå¤è¯»æ´»å¨çæ¹å¼
æåå说ä¸ä¸Goå¤è¯»æ´»å¨çæ¹å¼åç®æ ãå¼èªGoå¤è¯»çgithub说ææ件ï¼
ç±ä¸ä¸ªä¸»è®²äººå¸¦ç大家ä¸èµ·å»é 读 Go æºä»£ç ï¼ä¸èµ·å»åé£äºé¾åçç®æ³ãå¦ä¹ 代ç éé¢çå¥æ·«æå·§ï¼éå°é®é¢æè æçæäºï¼æ们å¯ä»¥ä¸èµ·å»æ£ç´¢ï¼è§£çè¿äºé®é¢ãæ们å¯ä»¥ä¸èµ·å¦ä¹ ï¼å ±åæé¿ã
æ们å¸æå¯ä»¥æ¨è¿å¤§å®¶æ·±å ¥äºè§£ Go ï¼å¿«éæé¿ä¸ºèµæ·±ç Gopher ãæ们å¸ææ¯æ¬¡æ¥äºç人å没æ¥ç人é½è½å¤ææ¶è·ï¼æé¿ã
åé¢æ说Goå¤è¯»æ´»å¨çå°ä¼ä¼´æ¯ä¸ç¾¤æ追æ±ç人ï¼è¿éæä¹æåºä¸äºé®é¢å§ãå°±æåä¸çä¸ææ¥çï¼è½ç¶zoomæ¥å ¥äººæ°å¾å¤ï¼é«å³°æ50+人ï¼ä½æ¯å ¨è¿ç¨å¤§å®¶äº¤æµæ¯è¾å°ï¼åºæ¬ä¸æ¯ä¸»è®²äººä¸ä¸ªäººå¨é£èªå¨ãæ¥æ大ç¥è®²çé£æï¼åªææå ¨ç¨æé®ãæè§åæ¯æ们两个人å¨å¯¹è¯ï¼æçé®é¢å¼æ¸ æ¥äºï¼åªæ¯ä¸ç¥éå ¶ä»çåä¸åå¦å¦ä½ï¼
æåç»å享è ååä¸è æä¸äºå»ºè®®å§ï¼
对äºå享è ï¼äºå å好å 足çåå¤ï¼å¯ä»¥å¨æç« éååºä¸»è¦çç¹ï¼æ¾å¨githubéï¼åèæ¥æ大ç¥çplan9æ±ç¼è®²ä¹ï¼æéè¦çä¸ç¹ï¼å享åç»å¤§å®¶æä¾ä¸ä»½é¢ä¹ èµæã
对äºåä¸è ï¼è½è·å¾æå¤æ¶è·çæ¹å¼å°±æ¯ä¼åé¢ä¹ ï¼ä¼ä¸ç§¯ææé®ï¼ä¼åå¤ä¹ æ»ç»åæ£ãå¦å¤ï¼å¼ºç建议åä¸è ä¼åè¦åå¤è³å°ä¸ä¸ªé®é¢ï¼æé对æ§å°å¬ï¼æä¼ææ¶è·ãä¼ä¸ä¹è¦ç§¯ææé®ï¼è¿ä¹æ¯å¯¹ä¸»è®²è çåé¦ï¼ä¸è³äºä¸»è®²è è§å¾åªæèªå·±å¨å¯¹ççµè讲ã
æåï¼æ¬¢è¿æ¯ä¸ä¸ªå¦ä¹ Goè¯è¨çåå¦é½è½æ¥Goå¤è¯»ççï¼ç¹å»é 读åæå¯ä»¥çå°æç« éæå°çææèµæï¼å æ¬ä¸ææ¹å¤§plan9æ±ç¼çè§é¢åæ¾ï¼ä¸å®¹éè¿ï¼