<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 簡短變量申明規則 ### 規則一: 多變量賦值可能會重新聲明 我們知道使用`:=`一次可以聲明多個變量,像下面這樣: ~~~go field1, offset := nextField(str, 0) ~~~ 上面代碼定義了兩個變量,并用函數返回值進行賦值。 如果這兩個變量中的一個再次出現在`:=`左側就會重新聲明。像下面這樣: ~~~go field1, offset := nextField(str, 0) field2, offset := nextField(str, offset) ~~~ offset被重新聲明。 重新聲明并沒有什么問題,它并沒有引入新的變量,只是把變量的值改變了,但要明白,這是Go提供的一個語法糖。 * 當`:=`左側存在新變量時(如field2),那么已聲明的變量(如offset)則會被重新聲明,不會有其他額外副作用。 * 當`:=`左側沒有新變量是不允許的,編譯會提示`no new variable on left side of :=`。 我們所說的重新聲明不會引入問題要滿足一個前提,變量聲明要在同一個作用域中出現。如果出現在不同的作用域,那很可能就創建了新的同名變量,同一函數不同作用域的同名變量往往不是預期做法,很容易引入缺陷 ### 規則二:不能用于函數外部 簡短變量場景只能用于函數中,使用`:=`來聲明和初始化全局變量是行不通的。 比如,像下面這樣: ~~~go package sugar import fmt rule := "Short variable declarations" // syntax error: non-declaration statement outside function body ~~~ 這里的編譯錯誤提示`syntax error: non-declaration statement outside function body`,表示非聲明語句不能出現在函數外部。可以理解成`:=`實際上會拆分成兩個語句,即聲明和賦值。賦值語句不能出現在函數外部的 ## 變量作用域問題 幾乎所有的工程師都了解變量作用域,但是由于`:=`使用過于頻繁的話,還是有可能掉進陷阱里。 下面代碼源自真實項目,但為了描述方便,也為了避免信息安全風險,簡化如下: ~~~go func Redeclare() { field, err:= nextField() // 1號err if field == 1{ field, err:= nextField() // 2號err newField, err := nextField() // 3號err ... } ... } ~~~ 注意上面聲明的三個err變量。 2號err與1號err不屬于同一個作用域,`:=`聲明了新的變量,所以2號err與1號err屬于兩個變量。 2號err與3號err屬于同一個作用域,`:=`重新聲明了err但沒創建新的變量,所以2號err與3號err是同一個變量。 如果誤把2號err與1號err混淆,就很容易產生意想不到的錯誤 ## 常見陷阱 #### 題目一 問:下面代碼輸出什么? ~~~go func fun1() { i := 0 i, j := 1, 2 fmt.Printf("i = %d, j = %d\n", i, j) } ~~~ 程序輸出如下: ~~~go i = 1, j = 2 ~~~ 再進一步想一下,前一個語句中已經聲明了i, 為什么還可以再次聲明呢? #### 題目二 問:下面代碼為什么不能通過編譯? ~~~go func fun2(i int) { i := 0 fmt.Println(i) } ~~~ 不能通過編譯原因是形參已經聲明了變量i,使用`:=`再次聲明是不允許的 #### 題目三 問:下面代碼輸出什么? ~~~go func fun3() { i, j := 0, 0 if true { j, k := 1, 1 fmt.Printf("j = %d, k = %d\n", j, k) } fmt.Printf("i = %d, j = %d\n", i, j) } ~~~ 程序輸出如下: ~~~go j = 1, k = 1 i = 0, j = 0 ~~~ 這里要注意的是,block`if`中聲明的j,與上面的j屬于不同的作用域
                  <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>

                              哎呀哎呀视频在线观看