рдЗрдВрдЯрд░реНрдирд▓реНрд╕ рдЧреЛ: рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд▓рдкреЗрдЯреЗрдВ


рдЖрдЬ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд рдХреНрд▓реЛрдЬрд░ рдпрд╛ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЬрд╛рдиреЗрдВрдЧреЗ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ / рд▓рд┐рдВрдХ рдпрд╛ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЗрди рдмрд╛рддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рд╕реЗ рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕рднреА рдЗрдВрд╕рд╛рдЗрдб рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ!


рдФрд░ рдореИрдВ рдЖрдкрдХреЛ 7 рдЕрдХреНрдЯреВрдмрд░ рдХреЛ рдореЙрд╕реНрдХреЛ рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧреЛрд▓рдВрдЧ рдХреЙрдиреНрдл 2019 рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ ред рдореИрдВ рд╕рдореНрдореЗрд▓рди рдХреА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд┐рддрд┐ рдХрд╛ рд╕рджрд╕реНрдп рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдФрд░ рдореИрдВрдиреЗ рдХрдИ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрдЯреНрдЯрд░ рдФрд░ рдмрд╣реБрдд, рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд░рд┐рдкреЛрд░реНрдЯ рдЪреБрдиреА рд╣реИрдВред рдореИрдВ рдХреНрдпрд╛ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ!


рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рдореИрдВ рд▓реЗрдЦрдХ рдХреЛ рд╢рдмреНрдж рджреЗрддрд╛ рд╣реВрдВред



рдЧреЛ рд╡рд┐рдХреА рдкрд░ рдПрдХ рдкреЗрдЬ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣реИ рдлреНрд░рд┐рдХреНрд╡реЗрдВрдЯ рдорд┐рд╕реНрдЯреЗрдХреНрд╕ ред рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдЧреЛрд░реЛрдЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд▓реВрдк рдЪрд░ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ:


for _, val := range values { go func() { fmt.Println(val) }() } 

рдпрд╣ рдХреЛрдб рдорд╛рдиреЛрдВ рдХреЗ рдорд╛рди (рдорд╛рди) рдмрд╛рд░ рдХреЗ рдЕрдВрддрд┐рдо рдорд╛рди рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:


 // assume the type of each value is string for _, val := range values { go func(val string) { fmt.Println(val) }(val) } 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдлрд┐рд░ рдХрднреА рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдЬрд╛рдирдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рджреЛрдиреЛрдВ рдХреА рдЧрд╣рд░реА рд╕рдордЭ рджреЗрдЧрд╛ред


рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЗрдВ: рдореВрд▓реНрдп рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдФрд░ рд╕рдВрджрд░реНрдн рд╕реЗ рдЧреБрдЬрд░рдирд╛


рдЧреЛ рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореВрд▓реНрдп рд╕реЗ рдФрд░ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ [1] рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг 1 [2] рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


 func foobyval(n int) { fmt.Println(n) } func main() { for i := 0; i < 5; i++ { go foobyval(i) } time.Sleep(100 * time.Millisecond) } 

рдХрд┐рд╕реА рдХреЛ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо 0 рд╕реЗ 4 рддрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВред


рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг 2 рджреЗрдЦреЗрдВ ред


 func foobyref(n *int) { fmt.Println(*n) } func main() { for i := 0; i < 5; i++ { go foobyref(&i) } time.Sleep(100 * time.Millisecond) } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


5
5
5
5
5


рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХреНрдпреЛрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рд░ рдХреА рд╕рдордЭ рдХрд╛ 80% рдкрд╣рд▓реЗ рд╣реА рджреЗ рджреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рдХрд╛рд░рдгреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рд▓реЗрдВред


рдФрд░ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╡рд╣реАрдВ рд╣реИ рдЬреЛ рдЧреЛ рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реИ ред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдкрдврд╝рддрд╛ рд╣реИ:


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдШреЛрд╖рд┐рдд рдЪрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЪрд░ i рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд╕реНрддреБ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рдирдпрд╛ рдорд╛рди рд▓реЗрддреА рд╣реИред


рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг 1 рдореЗрдВ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдорд╢реАрди рдХреЛрдб [3] рдореЗрдВ рдЕрдВрддрд░ рджреЗрдЦреЗрдВ рдФрд░ 2 рдЙрджрд╛рд╣рд░рдг 1 рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред


 0x0026 00038 (go-func-byval.go:14) MOVL $8, (SP) 0x002d 00045 (go-func-byval.go:14) LEAQ "".foobyval┬╖f(SB), CX 0x0034 00052 (go-func-byval.go:14) MOVQ CX, 8(SP) 0x0039 00057 (go-func-byval.go:14) MOVQ AX, 16(SP) 0x003e 00062 (go-func-byval.go:14) CALL runtime.newproc(SB) 0x0043 00067 (go-func-byval.go:13) MOVQ "".i+24(SP), AX 0x0048 00072 (go-func-byval.go:13) INCQ AX 0x004b 00075 (go-func-byval.go:13) CMPQ AX, $5 0x004f 00079 (go-func-byval.go:13) JLT 33 

Go рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ runtime.newproc рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред рдЕрдм рд╣рдо рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░ i рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ AX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЛрдмреНрдпрд╡рд▓ рдлрдВрдХреНрд╢рди [4] рдореЗрдВ рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдореВрд▓реНрдп рд╕реЗ" рд╕реНрдЯреИрдХ рдкрд░ AX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдПрдХреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдпрд╣ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдлреЛрдмрд╛рдЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрдпрд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдФрд░ рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг 2 рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 0x0040 00064 (go-func-byref.go:14) LEAQ "".foobyref┬╖f(SB), CX 0x0047 00071 (go-func-byref.go:14) MOVQ CX, 8(SP) 0x004c 00076 (go-func-byref.go:14) MOVQ AX, 16(SP) 0x0051 00081 (go-func-byref.go:14) CALL runtime.newproc(SB) 0x0056 00086 (go-func-byref.go:13) MOVQ "".&i+24(SP), AX 0x005b 00091 (go-func-byref.go:13) INCQ (AX) 0x005e 00094 (go-func-byref.go:13) CMPQ (AX), $5 0x0062 00098 (go-func-byref.go:13) JLT 57 

рдХреЛрдб рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ - рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдЕрдВрддрд░ред рдЕрдм AX рдореЗрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ i рд╣реИ, рди рдХрд┐ рдЗрд╕рдХрд╛ рдорд╛рдиред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдФрд░ рддреБрд▓рдирд╛ (AX) рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ, AX рдкрд░ рдирд╣реАрдВред рдФрд░ рдлрд┐рд░, рдЬрдм рд╣рдо рдПрдХреНрд╕рдПрдХреНрд╕ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо, рдпрд╣ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдкрддрд╛ I рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рдмрджрд▓рд╛рд╡ (AX) рдХреЛ рдЧреЛрд░реЛрдЗрди рдореЗрдВ рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред


рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдлреЛрдмрд╛рдпрд░реЗрдлрд╝рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдХ рдирдВрдмрд░ рдкрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рдЪрдХреНрд░ рддреЗрдЬреА рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд┐рдд рдЧреЛрд░реЛрдирд╛рдЗрдЯ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдЬрдм рд╡реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЪрд░ i рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрдЧрд╛, рдФрд░ рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдФрд░ рдЗрд╕ рд╕рдордп i рдХрд╛ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реИ? рдорд╛рди 5. рд╡рд╣ рдмрд╣реБрдд рдЬрд┐рд╕ рдкрд░ рдЪрдХреНрд░ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ред рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рднреА рдЧреЛрд░рдЖрдЙрдЯ 5 рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред


рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рд╡реА.рдПрд╕. рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЗ


рдЧреЛрд░реЛрдирд╛рдЗрдЯреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рд╡рд┐рдХреА рдкреГрд╖реНрда рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг 3 рджреЗрдЦреЗрдВ :


 type MyInt int func (mi MyInt) Show() { fmt.Println(mi) } func main() { ms := []MyInt{50, 60, 70, 80, 90} for _, m := range ms { go m.Show() } time.Sleep(100 * time.Millisecond) } 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдордПрд╕ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рдереАред рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг 4 рд╢реЛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 type MyInt int func (mi *MyInt) Show() { fmt.Println(*mi) } func main() { ms := []MyInt{50, 60, 70, 80, 90} for _, m := range ms { go m.Show() } time.Sleep(100 * time.Millisecond) } 

рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреНрдпрд╛ рд╣реЛрдЧрд╛: 90, рдкрд╛рдВрдЪ рдмрд╛рд░ рдореБрджреНрд░рд┐рддред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдорд╛рди рд╣реИред рдпрд╣рд╛рдВ рд╕реВрдЪрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЧреЛ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рдХреЗ рдХрд╛рд░рдг рд╕рдорд╕реНрдпрд╛ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрджрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг 1 рд╕реЗ рдЙрджрд╛рд╣рд░рдг 2 рддрдХ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ i рдФрд░ i рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рддреЛ рдХреЙрд▓ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ! m.Show () рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрд▓рдЧ рд╣реИред


рджреЛ рдЧреЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЦреБрд╢ рд╕рдВрдпреЛрдЬрди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдХреЙрд▓ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреБрдЫ рднреА рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рд╢реЛ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЙрд▓ рдХреИрд╕реЗ рд╣реЛрдЧрд╛ (рдФрд░ рд╡рд┐рдзрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред


рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рд╣рдо рдХреНрд▓реАрдирд░ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ, рд╕рдВрджрд░реНрдн рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред


рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ


рдЕрдВрдд рдореЗрдВ рд╣рдо рдХреНрд▓реЛрдЬрд░ рдкрд░ рдЖрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг 5 рдкрд░ рджреЗрдЦреЗрдВ :


 func foobyval(n int) { fmt.Println(n) } func main() { for i := 0; i < 5; i++ { go func() { foobyval(i) }() } time.Sleep(100 * time.Millisecond) } 

рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛:


5
5
5
5
5


рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдлреЛрдмреЙрдпрд╡рд▓ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг 1 рдХреЗ рд╕рдорд╛рдиред рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ? рдЖрдЗрдП рдХреЛрдбрд╛рдВрддрд░рдХ рд▓реВрдк рджреГрд╢реНрдп рдХреЛ рджреЗрдЦреЗрдВ:


 0x0040 00064 (go-closure.go:14) LEAQ "".main.func1┬╖f(SB), CX 0x0047 00071 (go-closure.go:14) MOVQ CX, 8(SP) 0x004c 00076 (go-closure.go:14) MOVQ AX, 16(SP) 0x0051 00081 (go-closure.go:14) CALL runtime.newproc(SB) 0x0056 00086 (go-closure.go:13) MOVQ "".&i+24(SP), AX 0x005b 00091 (go-closure.go:13) INCQ (AX) 0x005e 00094 (go-closure.go:13) CMPQ (AX), $5 0x0062 00098 (go-closure.go:13) JLT 57 

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг 2 рдХреЗ рд╕рдорд╛рди рд╣реИ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореБрдЭреЗ AX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдкрддреЗ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рд╕рдВрджрд░реНрдн рд╕реЗ i рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдлреЛрдмреНрд╡рд╛рдпрд╡рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реВрдк рдХрд╛ рд╢рд░реАрд░ рд░рдирдЯрд╛рдЗрдо.рдиреНрдпреВрдкреНрд░реЛрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ?


Func1 рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдХреНрд▓реЛрдЬрд░ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдХреНрд▓реЛрдЬрд░ рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВред


рдпрд╣ рдлрдВрдХ 1 рдХрд╛ рд╢рд░реАрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 0x0000 00000 (go-closure.go:14) MOVQ (TLS), CX 0x0009 00009 (go-closure.go:14) CMPQ SP, 16(CX) 0x000d 00013 (go-closure.go:14) JLS 56 0x000f 00015 (go-closure.go:14) SUBQ $16, SP 0x0013 00019 (go-closure.go:14) MOVQ BP, 8(SP) 0x0018 00024 (go-closure.go:14) LEAQ 8(SP), BP 0x001d 00029 (go-closure.go:15) MOVQ "".&i+24(SP), AX 0x0022 00034 (go-closure.go:15) MOVQ (AX), AX 0x0025 00037 (go-closure.go:15) MOVQ AX, (SP) 0x0029 00041 (go-closure.go:15) CALL "".foobyval(SB) 0x002e 00046 (go-closure.go:16) MOVQ 8(SP), BP 0x0033 00051 (go-closure.go:16) ADDQ $16, SP 0x0037 00055 (go-closure.go:16) RET 

рдпрд╣рд╛рдВ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ 24 (SP) рдореЗрдВ рдПрдХ рддрд░реНрдХ рд╣реИ, рдЬреЛ рдХрд┐ int рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ: рд▓рд╛рдЗрди MOVQ (AX), AX рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬреЛ рдлрд╝реЙрдмреЙрдпрд╡рд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, func1 рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 func func1(i *int) { foobyval(*i) }    main   - : for i := 0; i < 5; i++ { go func1(&i) } 

рдЙрджрд╛рд╣рд░рдг 2 рдХреЗ рд╕рдордХрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдмрддрд╛рддреЗ рд╣реИрдВред рддрдХрдиреАрдХреА рднрд╛рд╖рд╛ рдореЗрдВ, рд╣рдо рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рдореИрдВ рдПрдХ рдмрдВрдж рдХреЗ рдЕрдВрджрд░ рдПрдХ рдореБрдлреНрдд рдЪрд░ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд░ рдЧреЛ рдореЗрдВ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ? рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдлреНрдд рдЪрд░ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдПрдХ рднрд┐рдиреНрдирддрд╛ рд╣реИ:


 for i := 0; i < 5; i++ { ii := i go func() { foobyval(ii) }() } 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ 0, 1, 2, 3, 4 рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╡реНрдпрд╡рд╣рд╛рд░ 5 рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реИ?


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ рдХреА рдПрдХ рдХрд▓рд╛рдХреГрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ рд╕рдВрдХрд▓рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рд╣рдо рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрддреЗ рд╣реИрдВ


рдпрджрд┐ рдЖрдк рдЧреЛ рд╕рдВрдХрд▓рдХ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдореЗрд░реЗ рд╢реБрд░реБрдЖрддреА рд▓реЗрдЦ рдкрдврд╝реЗрдВ: рднрд╛рдЧ рез , рднрд╛рдЧ реи ред


рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ (рд╕рд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд) рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡реГрдХреНрд╖ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 0: *syntax.CallStmt { . Tok: go . Call: *syntax.CallExpr { . . Fun: *syntax.FuncLit { . . . Type: *syntax.FuncType { . . . . ParamList: nil . . . . ResultList: nil . . . } . . . Body: *syntax.BlockStmt { . . . . List: []syntax.Stmt (1 entries) { . . . . . 0: *syntax.ExprStmt { . . . . . . X: *syntax.CallExpr { . . . . . . . Fun: foobyval @ go-closure.go:15:4 . . . . . . . ArgList: []syntax.Expr (1 entries) { . . . . . . . . 0: i @ go-closure.go:15:13 . . . . . . . } . . . . . . . HasDots: false . . . . . . } . . . . . } . . . . } . . . . Rbrace: syntax.Pos {} . . . } . . } . . ArgList: nil . . HasDots: false . } } 

рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдлрд╝рдВрдХреНрд╢рди рдлрдВрдХрд▓рд┐рдЯ рдиреЛрдб рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рдиред рдЬрдм рдЗрд╕ рдкреЗрдбрд╝ рдХреЛ AST (рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА) рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдирд┐рд░рдВрддрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред рдпрд╣ noder.funcLit рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ gc / closure.go рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред


рдлрд┐рд░ рдкрдХрд╛ рд╣реБрдЖ рдЪреЗрдХрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдПрдПрд╕рдЯреА рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:


 main.func1: . DCLFUNC l(14) tc(1) FUNC-func() . DCLFUNC-body . . CALLFUNC l(15) tc(1) . . . NAME-main.foobyval a(true) l(8) x(0) class(PFUNC) tc(1) used FUNC-func(int) . . CALLFUNC-list . . . NAME-main.il(15) x(0) class(PAUTOHEAP) tc(1) used int 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝реЙрдмреЙрдпрд╡рд▓ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди NAME-main.i рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд▓реЛрдЬрд░ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдЯреЗрдЬ, рдЬрд┐рд╕реЗ рдХреИрдкреНрдЪрд░рд╡рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ "рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рд╡реИрд░рд┐рдПрдмрд▓" рд╣реИ, рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ "рдмрдВрдж рдЪрд░" рдкрд░ рдХрдмреНрдЬрд╛ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдЕрд░реНрдерд╛рдд рдмрдВрдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореБрдХреНрдд рдЪрд░)ред рдпрд╣рд╛рдБ рд╕рдВрдЧрдд рд╕рдВрдХрд▓рдХ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдЬреЛ рднреА рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:


// рдХреИрдкреНрдЪрд░рд░реНрд╕ рдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрд▓рдЧ рдЪрд░рдг рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
// рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдпрд╛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
// рд╣рдо рдорд╛рди рдХреЗ рд▓рд┐рдП рдХреИрдкреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ <= 128 рдмрд╛рдЗрдЯреНрд╕ рдЬреЛ рдЕрдм рдХреИрдкреНрдЪрд░ (рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ) рдХреЗ рдмрд╛рдж рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред


рдЬрдм рдХреИрдкреНрдЪрд░рд╡рд╛рд░реНрд╕ рдХреЛ рдЙрджрд╛рд╣рд░рдг 5 рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдореБрдЭреЗ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдРрдбрд░реНрдХреЗрди рдзреНрд╡рдЬ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдПрдПрд╕рдЯреА рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 FOR l(13) tc(1) . LT l(13) tc(1) bool . . NAME-main.ia(true) g(1) l(13) x(0) class(PAUTOHEAP) esc(h) tc(1) addrtaken assigned used int 

рд▓реВрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП, "рд╡реИрд▓реНрдпреВ рдмрд╛рдп" рд╕рд┐рд▓реЗрдХреНрд╢рди рд╣реНрдпреВрд░рд┐рд╕реНрдЯрд┐рдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рд╡реИрд░рд┐рдПрдмрд▓ рдЕрдкрдирд╛ рд╡реИрд▓реНрдпреВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ (рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рд╕реЗ рдХреЛрдЯ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд▓реВрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдЪрд░ рдореИрдВ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрд╕ рднрд┐рдиреНрдирддрд╛ рдореЗрдВ, рдЬрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ii: = i, ii рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореВрд▓реНрдп [5] рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рднрд╛рд╖рд╛ рдХреА рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рдирдП рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЧреЛ рдПрдХ рд╣реА рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреА рдЯреНрд░рд┐рдЧрд░ рдФрд░ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреА рдкрд╕рдВрдж рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред Go FAQ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред


рднрд╛рд╖рд╛ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ (рдПрдХ рдирдП рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ) рд╢рд╛рдпрдж рдПрдХ рдЧрд▓рддреА рд╣реИред рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣рдо рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг 1 рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рд░реЗрдХ рдкрд░ рдХрджрдо рдирд╣реАрдВ рд░рдЦреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдореБрдХреНрдд рдЪрд░ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЧреЛрд░рдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдЪрд░ рд╣реА рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рдЙрдбрд╝рд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рднреА рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред




[рез] рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐, рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдЧреЛ рдореЗрдВ "рд╕рдВрджрд░реНрдн рд╕реЗ рдЧреБрдЬрд░" рдХреА рдХреЛрдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдореВрд▓реНрдп рд╕рд╣рд┐рдд рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХреЗрдд рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЬрдм рдЖрдк "рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕" рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ "рдкрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕" рдФрд░ рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдФрд░ n рдХрд░рдирд╛ рдЬреЛ * int рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд░рдЦрддрд╛ рд╣реИ), рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдмрд╛рдж рдореЗрдВред рд▓реЗрдЦ рдХреЗ рдХреБрдЫ рднрд╛рдЧред


[реи] рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╕реЛрддреЗ рд╕рдордп рд╕рднреА рдЧреЛрд░реЛрдЗрдЯрд┐рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдПрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдореБрдЦреНрдп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЧреЛрд░реЛрдирд╛рдЗрдЯ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡реЗрдЯрдЧреНрд░реБрдк рдпрд╛ рдХрд┐рдП рдЧрдП рдЪреИрдирд▓ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


[рей] рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдЧреЛ рдЯреВрд▓ рдХрдВрдкрд╛рдЗрд▓ -l -S рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред -L рдзреНрд╡рдЬ рдлрдВрдХреНрд╢рди рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред


[рек] рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдлрд╝реЙрдмреАрд╡рд▓ рдХреЛ рд╕реАрдзреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдкрддрд╛ runtime.newproc рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рддрд░реНрдХ (16 (SP)) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд╝реЙрдмреЙрдпрд╡рд▓ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХрд╛ рддрд░реНрдХ рд╕реНрдЯреИрдХ рдКрдкрд░ рдЬрд╛рддрд╛ рд╣реИред


[рел] рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдИрдУ = резреж рдХреЛ рд▓реВрдк рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж)ред рдЖрдкрдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреНрдпрд╛ рдерд╛? рдХреНрдпреЛрдВ?

Source: https://habr.com/ru/post/hi468863/


All Articles