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