纯新手小白,大佬多多指正。
接着第一篇,变量和指向变量的指针大差不差,本文讨论一下函数。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("happy")
happy()
go hello()
time.Sleep(1000)
//hello()
}
func happy() {
fmt.Println("unhappy")
}
func hello() {
var a int
for a = 12; a < 18; a++ {
fmt.Println(a)
}
}
简简单单的程序,看看反汇编
ida的函数识别只识别出来了hello函数,并未识别happy函数,应该是hello函数中用了go关键字,新开了一个协程
调试过程中,从内存的字符串也能看出,编译时并未把happy函数当做独立的函数来出处理,而是直接将源代码中happy函数的代码写入main函数,作为一个统一的函数来处理。
在源代码中,我们也能明显地感到go关键字存在与否带来的巨大差异,
在此时新开了一个协程,对应代码如下
此时我们就不能把新开的协程给暂停了,可以跟进,逻辑很简单
接下来是函数指针
package main
import "fmt"
func main() {
fmt.Println("hello")
var pt func()
pt = touful
pt()
}
func touful() {
fmt.Println("joy")
}
此时我们用指针来调用函数,ida就能识别出touful函数了,也就是说,编译时给touful函数单独划分了栈帧。
至于指针,如图就是用指针调用函数的过程,可以看出,总的来说,go的指针是比较方便使用的。