Go言語の基本機能を理解するための記事(後編)
Go 関数のメモリ割り当て図
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

SQL.Openを使用する場合、DSNがエラーを報告しないのはなぜですか? GO言語では、sql.open ...
