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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                Golang 包結構 :所有代碼都必須組織在 package 中。 ~~~ ? 源文件頭部以 "package <name>" 聲明包名稱。 ? 包由同一目錄下的多個源碼文件組成。 ? 包名類似 namespace,與包所在目錄名、編譯文件名無關。 ? 目錄名最好不用 main、all、std 這三個保留名稱。 ? 可執行文件必須包含 package main,入口函數 main。 ~~~ 說明:os.Args 返回命令行參數,os.Exit 終止進程。要獲取正確的可執行文件路徑,可用 `filepath.Abs(exec.LookPath(os.Args[0]))`。 package 基本的管理單元: 同一個package下面,可以有非常多的不同文件,只要每個文件的頭部 都有 如 "package xxx" 的相同name 就可以 在主方法中使用 xxx.Method()調用不同文件中的方法了。 文件夾名字可以和這個package 名稱不一致, 比如我有個文件夾名字是mypackage,其中包含了a.go,b.go, c.go三個文件 : ~~~ mypackage | --a.go | --b.go | --c.go ~~~ 比如a.go中有 Saya(),b.go中有Sayb() 而幾個文件共同的package name 確是testpackage 所以在 主函數中調用a.go 和b.go文件中的各自方法只要用,testpackage.Saya() ,testpackage.Sayb()即可 還有默認的init方法,在import進來的時候就去執行了,而且允許每個文件中都有init()這個方法,當然是每個都會執行。 導出包: 在 Go 中,包中成員以名稱首字母大小寫決定訪問權限。首字母大寫的名稱是被導出的。 在導入包之后,你只能訪問包所導出的名字,任何未導出的名字是不能被包外的代碼訪問的。 Foo 和 FOO 都是被導出的名稱。名稱 foo 是不會被導出的。 ~~~ ? public: 首字母大寫,可被包外訪問。 ? internal: 首字母小寫,僅包內成員可以訪問。 ~~~ 該規則適用于全局變量、全局常量、類型、結構字段、函數、方法等。 導入包 :使用包成員前,必須先用 import 關鍵字導入,但不能形成導入循環。 import "相對目錄/包主文件名" 相對目錄是指從` <workspace>/pkg/<os_arch> `開始的子目錄,以標準庫為例: ~~~ import "fmt" -> /usr/local/go/pkg/darwin_amd64/fmt.a import "os/exec" -> /usr/local/go/pkg/darwin_amd64/os/exec.a ~~~ 在導入時,可指定包成員訪問方式。比如對包重命名,以避免同名沖突。 import 用法: ~~~ import "fmt" 最常用的一種形式(系統包) import "./test" 導入同一目錄下test包中的內容(相對路徑) import "shorturl/model 加載gopath/src/shorturl/model模塊(絕對路徑) import f "fmt" 導入fmt,并給他啟別名f import . "fmt" 將fmt啟用別名".",這樣就可以直接使用其內容,而不用再添加fmt。 如fmt.Println可以直接寫成Println import _ "fmt" 表示不使用該包,而是只是使用該包的init函數,并不顯示的使用該包的其他內容。 注意:這種形式的import,當import時就執行了fmt包中的init函數,而不能夠使用該包的其他函數。 ~~~ 未使用的導入包,會被編譯器視為錯誤 (不包括 `"import _"`)。 ~~~ ./main.go:4: imported and not used: "fmt" ~~~ 自定義路徑 :可通過 meta 設置為代碼庫設置自定義路徑。 ~~~ server.go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `<meta name="go-import" content="test.com/qyuhen/test git https://github.com/qyuhen/test">`) } func main() { http.HandleFunc("/qyuhen/test", handler) http.ListenAndServe(":80", nil) } ~~~ 該示例使用自定義域名 test.com 重定向到 github。 ~~~ $ go get -v test.com/qyuhen/test Fetching https://test.com/qyuhen/test?go-get=1 https fetch failed. Fetching http://test.com/qyuhen/test?go-get=1 Parsing meta tags from http://test.com/qyuhen/test?go-get=1 (status code 200) get "test.com/qyuhen/test": found meta tag http://test.com/qyuhen/test?go-get=1 test.com/qyuhen/test (download) test.com/qyuhen/test ~~~ 如此,該庫就有兩個有效導入路徑,可能會導致存儲兩個本地副本。為此,可以給庫添加專門的 "import comment"。當 go get 下載完成后,會檢查本地存儲路徑和該注釋是否一致。 ~~~ github.com/qyuhen/test/abc.go package test // import "test.com/qyuhen/test" func Hello() { println("Hello, Custom import path!") } ~~~ 如繼續用 github 路徑,會導致 go build 失敗。 ~~~ $ go get -v github.com/qyuhen/test github.com/qyuhen/test (download) package github.com/qyuhen/test imports github.com/qyuhen/test imports github.com/qyuhen/test: expects import "test.com/qyuhen/test" ~~~ 這就強制包用戶使用唯一路徑,也便于日后將包遷移到其他位置。 Golang初始化 初始化函數: ~~~ ? 每個源文件都可以定義一個或多個初始化函數。 ? 編譯器不保證多個初始化函數執行次序。 ? 初始化函數在單一線程被調 ,僅執行一次。 ? 初始化函數在包所有全局變量初始化后執行。 ? 在所有初始化函數結束后才執行 main.main()。 ? 無法調用初始化函數。 ~~~ 因為無法保證初始化函數執行順序,因此全局變量應該直接用 var 初始化。 ~~~ var now = time.Now() func init() { fmt.Printf("now: %v\n", now) } func init() { fmt.Printf("since: %v\n", time.Now().Sub(now)) } ~~~ 可在初始化函數中使用 goroutine,可等待其結束。 ~~~ var now = time.Now() func main() { fmt.Println("main:", int(time.Now().Sub(now).Seconds())) } func init() { fmt.Println("init:", int(time.Now().Sub(now).Seconds())) w := make(chan bool) go func() { time.Sleep(time.Second * 3) w <- true }() <-w } ~~~ 輸出: ~~~ init: 0 main: 3 ~~~ 不應該濫用初始化函數,僅適合完成當前文件中的相關環境設置。
                  <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>

                              哎呀哎呀视频在线观看