Go 関数のメモリ割り当てはヒープ割り当てに少し似ていますが、本質的には同じではありません。
#ヒープ メモリと同様に、スタックにはヒープのアドレスが格納されていることがわかります。
package main import "fmt" func say() string { return "ok" } func main() { fmt.Printf("say栈上的内容:%p\n",say) }
グローバル変数
当然,任何函数都可以访问全局变量。 注:全局变量尽量全部用大写。 结果: 上述可能会有个问题,全局变量,全局变量,大家共用一个,要是谁傻不拉几修改了不就完蛋了,整个程序都凉了。 就像这样。 结果: 这不就完犊子了吗???所以,一定要有解决办法。 解决办法:使用常量定义全局变量。 在定义全局变量时,需要用 局部变量,局部变量就是在某个函数内定义的变量,只能在自己函数内使用。 更专业点,在 代码 在Go中, 如果函数没有 代码 执行结果 代码 执行结果 可以发现,defer的执行结果是反着的。 结论:最先执行的defer,会最后执行,最后执行的defer,会最先执行,有点像栈,先进后出。 通常来说,defer会用在释放数据库连接,关闭文件等需要在函数结束时处理的操作。 这里暂时先不举例子。 这俩,可以理解为Python中的 应用场景:比如某个web,在启动时,数据库都没连接成功,必定要启动失败,就像电脑,没有电源必不能开机一样。 先看一下语法吧 执行效果 可以看淡, 尝试捕捉 代码小试牛刀
package main
import "fmt"
var NAME = "张三"
func say() string {
fmt.Println(NAME)
return "ok"
}
func main() {
say()
fmt.Println(NAME)
}
var引发的问题
package main
import "fmt"
var NAME = "张三"
func say() string {
fmt.Println(NAME)
NAME = "李四"
return "ok"
}
func main() {
say()
fmt.Println(NAME)
}
使用const解决问题
package main
import "fmt"
const NAME = "张三"
func say() string {
fmt.Println(NAME)
//NAME = "李四"//会报错:cannot assign to NAME
return "ok"
}
func main() {
say()
fmt.Println(NAME)
}
总结
const
修饰,并且变量名全部大写。局部变量
{}
内定义的,只能在{}
内使用,for
同理。package main
import (
"fmt"
)
func say() string {
var name = "张三"
fmt.Println(name)
return "ok"
}
func main() {
say()
//fmt.Println(name)//会报错:undefined: name
//for同理
for i := 0; i <= 1; i++ {
var c = "66"
fmt.Println(c) //66
}
//fmt.Println(c)//会报错:undefined: c
}
defer
defer
语句,可以理解为在return
之前执行的一个语句。return
,会有一个默认的return
,只是看不见而已。一个defer
package main
import "fmt"
func say() {
//defer尽量往前放
defer fmt.Println("我是666")
fmt.Println("你们都是最棒的")
}
func main() {
say()
}
多个defer
package main
import "fmt"
func say() {
//defer尽量往前放
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
fmt.Println("你们都是最棒的")
}
func main() {
say()
}
defer的作用
panic和recover
try
和raise
,因为在Go中,是没有try
的,是不能像其他语言一样,try
所有异常。panic
package main
import "fmt"
func say() {
var flag = true
if flag{
//引发错误,直接中断程序的错误
panic("OMG,撤了撤了,必须撤了")
}
}
func main() {
say()
fmt.Println("继续呀...")//不会执行,程序挂了
}
继续呀
就没打印,程序直接挂了,但是上述好像并没有解决这个问题。recover
package main
import "fmt"
func say() {
//匿名函数,defer执行的是一个匿名函数
defer func() {
var err = recover()
//如果有panic错误,err!=nil,在此处步骤,尝试恢复
if err != nil {
fmt.Println("尝试恢复...")
}
}()
var flag = true
if flag {
panic("OMG,撤了撤了,必须撤了")
}
}
func main() {
say()
fmt.Println("继续呀...")
}
执行结果
可以看到,如果recover捕捉了,并且没有panic
,程序就会继续正常执行。
defer
必须在panic
语句之前。
recover
必须配合defer
使用。
以上がGo言語の基本機能を理解するための記事(後編)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。