日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

go get 的不再src目录中_GO语言基础进阶教程:包的使用

發(fā)布時間:2025/3/8 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go get 的不再src目录中_GO语言基础进阶教程:包的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Go語言使用包(package)這種語法元素來組織源碼,所有語法可見性均定義在package這個級別,與Java 、python等語言相比,這算不上什么創(chuàng)新,但與C傳統(tǒng)的include相比,則是顯得“先進”了許多。

myblog ├── conf │ └── app.conf ├── controllers │ ├── aboutme_controller.go │ ├── add_article_controller.go │ ├── album_controller.go │ ├── base_controller.go │ ├── default.go │ ├── delete_article_controller.go │ ├── exit_controller.go │ ├── home_controller.go │ ├── login_controller.go │ ├── register_controller.go │ ├── show_article_controller.go │ ├── tags_controller.go │ ├── update_article_controller.go │ └── upload_controller.go ├── main.go ├── models │ ├── album_model.go │ ├── article_model.go │ ├── home_model.go │ ├── tags_model.go │ └── user_model.go ├── myblogweb ├── routers │ └── router.go ├── static │ ├── css │ │ ├── blogsheet.css │ │ └── lib │ │ ├── highlight.css │ │ └── login.css │ ├── img │ ├── js │ │ ├── blog.js │ │ ├── lib │ │ │ ├── jquery-3.3.1.min.js │ │ │ └── jquery.url.js │ │ └── reload.min.js │ └── upload │ └── img │ └── 2018 │ └── 12 │ └── 11 │ ├── 1544511378-bee2.png ├── tests │ └── default_test.go ├── utils │ ├── myUtils.go │ └── mysqlUtils.go └── views├── aboultme.html├── album.html├── block│ ├── home_block.html│ └── nav.html├── home.html├── index.tpl├── login.html├── register.html├── show_article.html├── tags.html└── write_article.html

Go 語言的源碼復(fù)用建立在包(package)基礎(chǔ)之上。包通過 package, import, GOPATH 操作完成。

1、 main包

Go 語言的入口 main() 函數(shù)所在的包(package)叫 main,main 包想要引用別的代碼,需要import導(dǎo)入!

2、 package

src 目錄是以代碼包的形式組織并保存 Go 源碼文件的。每個代碼包都和 src 目錄下的文件夾一一對應(yīng)。每個子目錄都是一個代碼包。

代碼包包名和文件目錄名,不要求一致。比如文件目錄叫 hello,但是代碼包包名可以聲明為 “main”,但是同一個目錄下的源碼文件第一行聲明的所屬包,必須一致!

同一個目錄下的所有.go文件的第一行添加 包定義,以標(biāo)記該文件歸屬的包,演示語法:

package 包名

包需要滿足:

  • 一個目錄下的同級文件歸屬一個包。也就是說,在同一個包下面的所有文件的package名,都是一樣的。
  • 在同一個包下面的文件package名都建議設(shè)為是該目錄名,但也可以不是。也就是說,包名可以與其目錄不同名。
  • 包名為 main 的包為應(yīng)用程序的入口包,其他包不能使用。
在同一個包下面的文件屬于同一個工程文件,不用import包,可以直接使用

包可以嵌套定義,對應(yīng)的就是嵌套目錄,但包名應(yīng)該與所在的目錄一致,例如:

// 文件:qf/ruby/tool.go中 package ruby // 可以被導(dǎo)出的函數(shù) func FuncPublic() { } // 不可以被導(dǎo)出的函數(shù) func funcPrivate() { }

包中,通過標(biāo)識符首字母是否大寫,來確定是否可以被導(dǎo)出。首字母大寫才可以被導(dǎo)出,視為 public 公共的資源。

3、 import

要引用其他包,可以使用 import 關(guān)鍵字,可以單個導(dǎo)入或者批量導(dǎo)入,語法演示:

A:通常導(dǎo)入

// 單個導(dǎo)入 import "package" // 批量導(dǎo)入 import ("package1""package2")

B:點操作我們有時候會看到如下的方式導(dǎo)入包

import(. "fmt" )

這個點操作的含義就是這個包導(dǎo)入之后在你調(diào)用這個包的函數(shù)時,你可以省略前綴的包名,也就是前面你調(diào)

用的fmt.Println("hello world")可以省略的寫成Println("hello world")

C:起別名

別名操作顧名思義我們可以把包命名成另一個我們用起來容易記憶的名字。導(dǎo)入時,可以為包定義別名,語法演示:

import (p1 "package1"p2 "package2") // 使用時:別名操作,調(diào)用包函數(shù)時前綴變成了我們的前綴 p1.Method()

D:_操作如果僅僅需要導(dǎo)入包時執(zhí)行初始化操作,并不需要使用包內(nèi)的其他函數(shù),常量等資源。則可以在導(dǎo)入包時,匿名導(dǎo)入。

這個操作經(jīng)常是讓很多人費解的一個操作符,請看下面這個import:

import ("database/sql"_ "github.com/ziutek/mymysql/godrv")

_操作其實是引入該包,而不直接使用包里面的函數(shù),而是調(diào)用了該包里面的init函數(shù)。也就是說,使用下劃線作為包的別名,會僅僅執(zhí)行init()。

導(dǎo)入的包的路徑名,可以是相對路徑也可以是絕對路徑,推薦使用絕對路徑(起始于工程根目錄)。

4、GOPATH環(huán)境變量

import導(dǎo)入時,會從GO的安裝目錄(也就是GOROOT環(huán)境變量設(shè)置的目錄)和GOPATH環(huán)境變量設(shè)置的目錄中,檢索 src/package 來導(dǎo)入包。如果不存在,則導(dǎo)入失敗。GOROOT,就是GO內(nèi)置的包所在的位置。GOPATH,就是我們自己定義的包的位置。

通常我們在開發(fā)Go項目時,調(diào)試或者編譯構(gòu)建時,需要設(shè)置GOPATH指向我們的項目目錄,目錄中的src目錄中的包就可以被導(dǎo)入了。

5、init() 包初始化

下面我們詳細的來介紹一下這兩個函數(shù):init()、main() 是 go 語言中的保留函數(shù)。我們可以在源碼中,定義 init() 函數(shù)。此函數(shù)會在包被導(dǎo)入時執(zhí)行,例如如果是在 main 中導(dǎo)入包,包中存在 init(),那么 init() 中的代碼會在 main() 函數(shù)執(zhí)行前執(zhí)行,用于初始化包所需要的特定資料。例如:包源碼:

src/userPackage/tool.go ? package userPackage import "fmt" func init() {fmt.Println("tool init") }

主函數(shù)源碼:

src/main.go ? package main import ("userPackage") func main() {fmt.Println("main run")// 使用userPackageuserPackage.SomeFunc() }

執(zhí)行時,會先輸出 "tool init",再輸出 "main run"。

下面我們詳細的來介紹一下init()、main() 這兩個函數(shù)。在 go 語言中的區(qū)別如下: 相同點:

兩個函數(shù)在定義時不能有任何的參數(shù)和返回值。該函數(shù)只能由 go 程序自動調(diào)用,不可以被引用。

不同點:

init 可以應(yīng)用于任意包中,且可以重復(fù)定義多個。main 函數(shù)只能用于 main 包中,且只能定義一個。

兩個函數(shù)的執(zhí)行順序:

在 main 包中的 go 文件默認總是會被執(zhí)行。

對同一個 go 文件的 init( ) 調(diào)用順序是從上到下的。

對同一個 package 中的不同文件,將文件名按字符串進行“從小到大”排序,之后順序調(diào)用各文件中的init()函數(shù)。

對于不同的 package,如果不相互依賴的話,按照 main 包中 import 的順序調(diào)用其包中的 init() 函數(shù)。

如果 package 存在依賴,調(diào)用順序為最后被依賴的最先被初始化,例如:導(dǎo)入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main,一次執(zhí)行對應(yīng)的 init 方法。main 包總是被最后一個初始化,因為它總是依賴別的包

避免出現(xiàn)循環(huán) import,例如:A –> B –> C –> A。

一個包被其它多個包 import,但只能被初始化一次

6、管理外部包

go允許import不同代碼庫的代碼。對于import要導(dǎo)入的外部的包,可以使用 go get 命令取下來放到GOPATH對應(yīng)的目錄中去。

舉個例子,比如說我們想通過go語言連接mysql數(shù)據(jù)庫,那么需要先下載mysql的數(shù)據(jù)包,打開終端并輸入以下命令:

localhost:~ ruby$ go get github.com/go-sql-driver/mysql

安裝之后,就可以在gopath目錄的src下,看到對應(yīng)的文件包目錄:

也就是說,對于go語言來講,其實并不關(guān)心你的代碼是內(nèi)部還是外部的,總之都在GOPATH里,任何import包的路徑都是從GOPATH開始的;唯一的區(qū)別,就是內(nèi)部依賴的包是開發(fā)者自己寫的,外部依賴的包是go get下來的。

擴展

我們可以通過go install 來編譯包文件。

我們知道一個非main包在編譯后會生成一個.a文件(在臨時目錄下生成,除非使用go install安裝到$GOROOT或?$GOPATH下,否則你看不到.a),用于后續(xù)可執(zhí)行程序鏈接使用。

比如Go標(biāo)準(zhǔn)庫中的包對應(yīng)的源碼部分路徑在:$GOROOT/src,而標(biāo)準(zhǔn)庫中包編譯后的.a文件路徑在$GOROOT/pkg/darwin_amd64下。


作者:茹姐

出處:千鋒教育go語言教研部

總結(jié)

以上是生活随笔為你收集整理的go get 的不再src目录中_GO语言基础进阶教程:包的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。