<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                Go語言的類型系統會在編譯時捕獲很多錯誤,但有些錯誤只能在運行時檢查,如數組訪問越界、空指針引用等。這些運行時錯誤會引起宕機。 一般而言,當發生宕機。程序會中斷運行,并立即執行該goroutine(可以先理解成線程)中被延遲的函數(defer機制)。隨后,程序崩潰并輸出日志信息,日志信息包括panic value和函數調用的堆棧跟蹤信息,panic value通常是某種錯誤信息。 雖然Go語言的panic機制類似于其他語言的異常。但panic的適用場景有一些不同,由于panic會引起程序的崩潰。因此panic一般用于嚴重錯誤,如程序內部的邏輯不一致。任何崩潰都表明了代碼中可能存在漏洞,所以對于大部門漏洞,我們應該使用Go語言提供的錯誤機制,而不是panic。 ## 手動觸發宕機 Go語言可以在程序中手動觸發宕機,讓程序崩潰,這樣開發者可以及時地發現錯誤,同時減少可能的損失。 Go語言程序在宕機時,會將堆棧和 goroutine 信息輸出到控制臺,所以宕機也可以方便地知曉發生錯誤的位置,那么我們要如何觸發宕機呢, 示例代碼如下所示: ~~~ package main func main() { panic("crash") } ~~~ 代碼運行崩潰并輸出如下: ~~~ panic: crash goroutine 1 [running]: main.main() D:/code/main.go:4 +0x40 exit status 2 ~~~ ## 在運行依賴的必備資源缺失時主動觸發宕機 regexp 是Go語言的正則表達式包,正則表達式需要編譯后才能使用,而且編譯必須是成功的,表示正則表達式可用。 編譯正則表達式函數有兩種,具體如下: #### 1) func Compile(expr string) (\*Regexp, error) 編譯正則表達式,發生錯誤時返回編譯錯誤同時返回 Regexp 為 nil,該函數適用于在編譯錯誤時獲得編譯錯誤進行處理,同時繼續后續執行的環境。 #### 2) func MustCompile(str string) \*Regexp 當編譯正則表達式發生錯誤時,使用 panic 觸發宕機,該函數適用于直接使用正則表達式而無須處理正則表達式錯誤的情況。 MustCompile 的代碼如下: ~~~ func MustCompile(str string) *Regexp { regexp, error := Compile(str) if error != nil { panic(`regexp: Compile(` + quote(str) + `): ` + error.Error()) } return regexp } ~~~ ## 在宕機時觸發延遲執行語句 當 panic() 觸發的宕機發生時,panic() 后面的代碼將不會被運行,但是在 panic() 函數前面已經運行過的 defer 語句依然會在宕機發生時發生作用,參考下面代碼: ~~~ package main import "fmt" func main() { defer fmt.Println("宕機后要做的事情1") defer fmt.Println("宕機后要做的事情2") panic("宕機") } ~~~ 代碼輸出如下: ~~~ 宕機后要做的事情2 宕機后要做的事情1 panic: 宕機 goroutine 1 [running]: main.main() D:/code/main.go:8 +0xf8 exit status 2 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看