mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 04:22:22 +00:00
ch3.6: 增加闭包函数的例子代码
This commit is contained in:
parent
2bc48ddcfc
commit
2fdc98fa00
34
examples/ch3.6/closure/main.go
Normal file
34
examples/ch3.6/closure/main.go
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright © 2018 ChaiShushan <chaishushan{AT}gmail.com>.
|
||||
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type FunTwiceClosure struct {
|
||||
F uintptr
|
||||
X int
|
||||
}
|
||||
|
||||
func NewTwiceFunClosure(x int) func() int {
|
||||
var p = &FunTwiceClosure{
|
||||
F: asmFunTwiceClosureAddr(),
|
||||
X: x,
|
||||
}
|
||||
return ptrToFunc(unsafe.Pointer(p))
|
||||
}
|
||||
|
||||
func ptrToFunc(p unsafe.Pointer) func() int
|
||||
|
||||
func asmFunTwiceClosureAddr() uintptr
|
||||
func asmFunTwiceClosureBody()
|
||||
|
||||
func main() {
|
||||
fnTwice := NewTwiceFunClosure(1)
|
||||
|
||||
println(fnTwice()) // 1*2 => 2
|
||||
println(fnTwice()) // 2*2 => 4
|
||||
println(fnTwice()) // 4*2 => 8
|
||||
}
|
22
examples/ch3.6/closure/main_amd64.s
Normal file
22
examples/ch3.6/closure/main_amd64.s
Normal file
@ -0,0 +1,22 @@
|
||||
// Copyright © 2018 ChaiShushan <chaishushan{AT}gmail.com>.
|
||||
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
|
||||
#include "textflag.h"
|
||||
|
||||
TEXT ·ptrToFunc(SB), NOSPLIT, $0-16
|
||||
MOVQ ptr+0(FP), AX // AX = ptr
|
||||
MOVQ AX, ret+8(FP) // return AX
|
||||
RET
|
||||
|
||||
TEXT ·asmFunTwiceClosureAddr(SB), NOSPLIT, $0-8
|
||||
LEAQ ·asmFunTwiceClosureBody(SB), AX // AX = ·asmFunTwiceClosureBody(SB)
|
||||
MOVQ AX, ret+0(FP) // return AX
|
||||
RET
|
||||
|
||||
TEXT ·asmFunTwiceClosureBody(SB), NOSPLIT|NEEDCTXT, $0-8
|
||||
MOVQ 8(DX), AX
|
||||
ADDQ AX , AX // AX *= 2
|
||||
MOVQ AX , 8(DX) // ctx.X = AX
|
||||
MOVQ AX , ret+0(FP) // return AX
|
||||
RET
|
||||
|
Loading…
x
Reference in New Issue
Block a user