<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          golang 多個(gè) init 方法的執(zhí)行順序

          共 981字,需瀏覽 2分鐘

           ·

          2021-03-23 13:31

          golang 里的 main 函數(shù)是程序的入口函數(shù),main 函數(shù)返回后,程序也就結(jié)束了。golang 還有另外一個(gè)特殊的函數(shù) init 函數(shù),先于 main 函數(shù)執(zhí)行,實(shí)現(xiàn)包級(jí)別的一些初始化操作,那么多個(gè) init 函數(shù)的執(zhí)行順序是怎么樣的呢?讓我們實(shí)踐一下看下結(jié)果吧。

          目錄結(jié)構(gòu):

          ├──?a
          │???└──?a.go
          ├──?b
          │???└──?b.go
          └──?main.go

          main.go 文件代碼:

          package?main

          import?(
          ????????"fmt"
          ????????"./b"
          ????????"./a"
          )

          func?init()?{
          ????fmt.Println("main?init?1")
          }

          func?init()?{
          ????fmt.Println("main?init?2")
          }

          func?main()?{
          ????fmt.Println("main")
          ????a.Add()
          ????b.Add()
          }

          a.go 文件代碼:

          package?a

          import?"fmt"

          func?init()?{
          ????fmt.Println("a?init")
          }

          func?Add()?{
          ????fmt.Println("a?Add")
          }

          b.go 文件代碼:

          package?b

          import?"fmt"

          func?init(){
          ????fmt.Println("b?init")
          }

          func?Add(){
          ????fmt.Println("b?Add")
          }

          輸出結(jié)果:

          ????[gotest]??go?run?main.go
          b?init
          a?init
          main?init?1
          main?init?2
          main
          a?Add
          b?Add

          結(jié)論:

          可以看出執(zhí)行順序是按照導(dǎo)入包的順序執(zhí)行,而不是按照調(diào)用先后順序執(zhí)行。

          init 函數(shù)的主要作用:初始化。

          init 函數(shù)的主要特點(diǎn):

          1. init 函數(shù)先于 main 函數(shù)自動(dòng)執(zhí)行,不能被其他函數(shù)調(diào)用;
          2. init 函數(shù)沒有輸入?yún)?shù)、返回值;
          3. 每個(gè)包可以有多個(gè) init 函數(shù);
          4. 包的每個(gè)源文件也可以有多個(gè) init 函數(shù),這點(diǎn)比較特殊;
          5. 同一個(gè)包的 init 執(zhí)行順序, golang 沒有明確定義,編程時(shí)要注意程序不要依賴這個(gè)執(zhí)行順序。
          6. 不同包的 init 函數(shù)按照包導(dǎo)入的依賴關(guān)系決定執(zhí)行順序。


          瀏覽 232
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.艹逼 | 天天撸天天撸 | 国产性在线电影 | 日日日夜夜操 | 亚洲视频国产三级 |