golang 之import和package的使用
golang 使用包 package 來(lái)管理定義模塊,可以使用 import 關(guān)鍵字來(lái)導(dǎo)入使用。
- 如果導(dǎo)入的是 go 自帶的包,則會(huì)去安裝目錄 $GOROOT/src 按包路徑加載,如 fmt 包
- 如果是我們 go get 安裝或自定義的包,則會(huì)去 $GOPATH/src 下加載
package 的定義
package 的存放位置是以 $GOPATH/src 作為根目錄,然后靈活的按照目錄去組織,且包名需與最后一級(jí)目錄名一致。
例如我們自定義 baz 包,包模塊的存放位置則為 $GOPATH/src/foo/bar/baz,baz 包的源碼都存放在此目錄下,foo/bar/baz 則作為包路徑被 import 載入。
我們需要規(guī)范的將 baz 包中源碼的 package 定義為 baz,就定義好一個(gè)可 import 載入的的包了。
hello 模塊
//$GOPATH/src/foo/bar/baz/hello.go
package baz
import (
"fmt"
)
// 模塊初始化函數(shù) import 包時(shí)被調(diào)用
func init() {
fmt.Println("hello module init function")
}
func Hello() {
return "hello"
}
world 模塊
//$GOPATH/src/foo/bar/baz/world.go
package baz
import (
"fmt"
)
// 模塊初始化函數(shù) import 包時(shí)被調(diào)用
func init() {
fmt.Println("world module init function")
}
func World() string {
return "world"
}
package main
import (
"fmt"
"foo/bar/baz" //引入我們自定義的包
)
func main() {
fmt.Println(baz.Hello(), baz.World())
}
import的使用
普通操作
import ( "fmt" "log" "foo/bar/baz" )
普通導(dǎo)入就是按照加載機(jī)制,將要使用的包導(dǎo)入進(jìn)來(lái),然后使用 packageName.MethodName 的方式調(diào)用包內(nèi)的方法即可。注意如果要包方法在其他包中可以調(diào)用,包方法需要首字母大寫(xiě),例如:fmt.Println() fmt.Printf()。
別名操作
package main
import (
"fmt"
myBaz "foo/bar/baz"
)
func main() {
fmt.Println(myBaz.Hello(), myBaz.World())
}
如果兩個(gè)包的包名存在沖突,或者包名太長(zhǎng)需要簡(jiǎn)寫(xiě)時(shí),我們可以使用別名導(dǎo)入來(lái)解決。
點(diǎn)操作
package main
import (
"fmt"
. "foo/bar/baz"
)
func main() {
fmt.Println(Hello(), World()) // 直接使用包內(nèi)的方法即可 不需要顯式使用包名
}
. 導(dǎo)入可以讓包內(nèi)的方法注冊(cè)到當(dāng)前包的上下文中,直接調(diào)用方法名即可,不需要再加包前綴。
下劃線操作
package main
import (
"fmt"
_ "foo/bar/baz"
)
func main() {
fmt.Println(baz.Hello(), baz.World()) // 錯(cuò)誤 _ 并沒(méi)有導(dǎo)入包 只是引入并執(zhí)行包模塊的 init 方法
}
_ 是包引用操作,只會(huì)執(zhí)行包下各模塊中的 init 方法,并不會(huì)真正的導(dǎo)入包,所以不可以調(diào)用包內(nèi)的其他方法。
相信對(duì)很多 phper 來(lái)說(shuō)遵循 PSR4 的 Namespace 會(huì)將與路徑緊密相關(guān)命名空間也作為類名的一部分,而 golang 則只將模塊目錄文件夾名作為包名,前面的路徑只是用來(lái)導(dǎo)入而和包名無(wú)關(guān),還是有一點(diǎn)點(diǎn)需要注意的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 如何解決django配置settings時(shí)遇到Could not import settings ''conf.local''
- Golang報(bào)“import cycle not allowed”錯(cuò)誤的2種解決方法
- 詳解golang避免循環(huán)import問(wèn)題(“import cycle not allowed”)
- golang中import cycle not allowed解決的一種思路
- go各種import的使用方法講解
- 對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解
- Golang import 導(dǎo)入包語(yǔ)法及一些特殊用法詳解
- Golang import本地包和導(dǎo)入問(wèn)題相關(guān)詳解
- golang import自定義包方式
- 解決golang在import自己的包報(bào)錯(cuò)的問(wèn)題
- 解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問(wèn)題
- Golang中 import cycle not allowed 問(wèn)題的解決方法
- Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解
相關(guān)文章
使用golang獲取linux上文件的訪問(wèn)/創(chuàng)建/修改時(shí)間
這篇文章主要介紹了使用golang獲取linux上文件的訪問(wèn)/創(chuàng)建/修改時(shí)間,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
一鍵定位Golang線上服務(wù)內(nèi)存泄露的秘籍
內(nèi)存泄露?別讓它拖垮你的Golang線上服務(wù)!快速掌握Go語(yǔ)言服務(wù)內(nèi)存泄漏排查秘籍,從此問(wèn)題無(wú)處遁形,一文讀懂如何精準(zhǔn)定位與有效解決Golang應(yīng)用中的內(nèi)存問(wèn)題,立即閱讀,讓性能飛升!2024-01-01
golang中切片copy復(fù)制和等號(hào)復(fù)制的區(qū)別介紹
這篇文章主要介紹了golang中切片copy復(fù)制和等號(hào)復(fù)制的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
go語(yǔ)言實(shí)現(xiàn)LRU緩存的示例代碼
LRU是一種常見(jiàn)的緩存淘汰策略,用于管理緩存中的數(shù)據(jù),本文主要介紹了go語(yǔ)言實(shí)現(xiàn)LRU緩存的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
golang定時(shí)任務(wù)cron項(xiàng)目實(shí)操指南
Go實(shí)現(xiàn)的cron 表達(dá)式的基本語(yǔ)法跟linux 中的 crontab基本是類似的,下面這篇文章主要給大家介紹了關(guān)于golang定時(shí)任務(wù)cron項(xiàng)目實(shí)操的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用
這篇文章主要介紹了在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用,來(lái)看下?Cobra?的使用,這里我們使用的?go1.13.3?版本,使用?Go?Modules?來(lái)進(jìn)行包管理,需要的朋友可以參考下2022-01-01

