<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之旅 廣告
                [TOC] Go中的初始化,雖然表面上看和C或者C++差別不大,但功能更加強大。在初始化過程中可以構建復雜的結構體,并且能夠正確處理初始化對象之間,甚至不同程序包之間的順序問題。 ## 常量 Go中的常量僅僅就是—常量。它們是在編譯時被創建,即使被定義為函數局部的也如此,并且只能是數字,字符(符文),字符串或者布爾類型。由于編譯時的限制,定義它們的表達式必須為能被編譯器求值的常量表達式。例如,`1<<3`是一個常量表達式,而`math.Sin(math.Pi/4)`不是,因為函數調用`math.Sin`需要在運行時才發生。 在Go中,枚舉常量使用`iota`枚舉器來創建。由于`iota`可以為表達式的一部分,并且表達式可以被隱式的重復,所以很容易創建復雜的值集。 ~~~ type ByteSize float64 const ( _ = iota // ignore first value by assigning to blank identifier KB ByteSize = 1 << (10 * iota) MB GB TB PB EB ZB YB ) ~~~ 可以將一個方法,比如`String`,附加到任何用戶定義的類型上,這種能力使得任何值都可以自動格式化打印。雖然你會看到它經常用于結構體,但這種技術還可用于標量類型,比如`ByteSize`這樣的浮點類型。 ~~~ func (b ByteSize) String() string { switch { case b >= YB: return fmt.Sprintf("%.2fYB", b/YB) case b >= ZB: return fmt.Sprintf("%.2fZB", b/ZB) case b >= EB: return fmt.Sprintf("%.2fEB", b/EB) case b >= PB: return fmt.Sprintf("%.2fPB", b/PB) case b >= TB: return fmt.Sprintf("%.2fTB", b/TB) case b >= GB: return fmt.Sprintf("%.2fGB", b/GB) case b >= MB: return fmt.Sprintf("%.2fMB", b/MB) case b >= KB: return fmt.Sprintf("%.2fKB", b/KB) } return fmt.Sprintf("%.2fB", b) } ~~~ 表達式`YB`會打印出`1.00YB`,而`ByteSize(1e13)`會打印出`9.09TB`。 這里使用`Sprintf`來實現`ByteSize`的`String`方法是安全的(避免了無窮遞歸),這并不是因為做了轉換,而是因為它是使用`%f`來調用`Sprintf`的,其不是一個字符串格式:`Sprintf`只有當想要一個字符串的時候,才調用`String`方法,而`%f`是想要一個浮點值。 ## 變量 變量可以像常量那樣進行初始化,不過初始值可以為運行時計算的通用表達式。 ~~~ var ( home = os.Getenv("HOME") user = os.Getenv("USER") gopath = os.Getenv("GOPATH") ) ~~~ ## init函數 最后,每個源文件可以定義自己的不帶參數的(niladic)`init`函數,來設置它所需的狀態。(實際上每個文件可以有多個`init`函數。)`init`是在程序包中所有變量聲明都被初始化,以及所有被導入的程序包中的變量初始化之后才被調用。 除了用于無法通過聲明來表示的初始化以外,`init`函數的一個常用法是在真正執行之前進行驗證或者修復程序狀態的正確性。 ~~~ func init() { if user == "" { log.Fatal("$USER not set") } if home == "" { home = "/home/" + user } if gopath == "" { gopath = home + "/go" } // gopath may be overridden by --gopath flag on command line. flag.StringVar(&gopath, "gopath", gopath, "override default GOPATH") } ~~~
                  <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>

                              哎呀哎呀视频在线观看