學(xué)習(xí)筆記-go庫(kù)源碼文件

庫(kù)源碼文件

庫(kù)源碼文件是不能被直接運(yùn)行的源碼文件,它僅用于存放程序?qū)嶓w,這些程序?qū)嶓w可以被其他代碼使用(只要遵從 Go 語(yǔ)言規(guī)范的話(huà))。他代碼”可以與被使用的程序?qū)嶓w在同一個(gè)源碼文件內(nèi),也可以在其他源碼文件,甚至其他代碼包中。

井岡山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站開(kāi)發(fā)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

1 怎樣把命令源碼文件中的代碼拆分到其他庫(kù)源碼文件?

cat demo4.go
package main ?//這里也申明了屬于main包
import (
    "flag"
)
var name string
func init() {
    flag.StringVar(&name, "name", "everyone", "The greeting object.")
}

func main() {
    flag.Parse()
    hello(name) //調(diào)用了代碼包一個(gè)叫作hello的函數(shù)
}
cat demo4_lib.go
package main ?//這里也申明了屬于main包
import "fmt"
func hello(name string) {
    fmt.Printf("Hello, %s!\n", name)
}
執(zhí)行:go run demo4.go demo4_lib.go 
Hello, everyone!
demo4.go 和 demo4_lib.go 都放在了一個(gè)相對(duì)路徑為q1的目錄中
$ ll
-rw-r--r--  1 daixuan  staff  178 11  6 22:13 demo4.go
-rw-r--r--  1 daixuan  staff   90 11  6 22:13 demo4_lib.go
$ go build .
ls
demo4.go        demo4_lib.go    q1//build一個(gè)q1文件
$ ./q1 
Hello, everyone!
$ ./q1 -name huaihe
Hello, huaihe!

代碼包聲明的基本規(guī)則。這里再總結(jié)一下:
第一條規(guī)則,同目錄下的源碼文件的代碼包聲明語(yǔ)句要一致。也就是說(shuō),它們要同屬于一個(gè)代碼包。這對(duì)于所有源碼文件都是適用的。
如果目錄中有命令源碼文件,那么其他種類(lèi)的源碼文件也應(yīng)該聲明屬于main包。這也是我們能夠成功構(gòu)建和運(yùn)行它們的前提。

第二條規(guī)則,源碼文件聲明的代碼包的名稱(chēng)可以與其所在的目錄的名稱(chēng)不同。在針對(duì)代碼包進(jìn)行構(gòu)建時(shí),生成的結(jié)果文件的主名稱(chēng)與其父目錄的名稱(chēng)一致。
對(duì)于命令源碼文件而言,構(gòu)建生成的可執(zhí)行文件的主名稱(chēng)會(huì)與其父目錄的名稱(chēng)相同

模塊化編程的方式,根據(jù)代碼的功能和用途把它們放置到不同的代碼包中

2 怎樣把命令源碼文件中的代碼拆分到其他代碼包?

先搞定環(huán)境變量:

vim ~/.bash_profile 
export GOPATH=/Users/daixuan/pinduoduo/go:/Users/daixuan/pinduoduo/go/src/github.com/Golang_Puzzlers
source ~/.bash_profile 
$ echo $GOPATH
/Users/daixuan/pinduoduo/go:/Users/daixuan/pinduoduo/go/src/github.com/Golang_Puzzlers

查看代碼包目錄:

/Users/daixuan/pinduoduo/go/src/github.com/Golang_Puzzlers/src/puzzlers/article3/q2
daixuandeMacBook-Pro:q2 daixuan$ tree .
.
├── demo5.go
└── lib
    └── demo5_lib.go

1 directory, 2 files

查看代碼文件:

 cat demo5.go 
package main

import (
        "flag"

        "github.com/Golang_Puzzlers/src/puzzlers/article3/q2/lib"
)

var name string

func init() {
        flag.StringVar(&name, "name", "everyone", "The greeting object.")
}

func main() {
        flag.Parse()
        lib.Hello(name)
}

 cat lib/demo5_lib.go 
package lib5 //注意,這里lib5應(yīng)該與父目錄lib對(duì)應(yīng),否則報(bào)錯(cuò)

import "fmt"

func Hello(name string) {
        fmt.Printf("Hello, %s!\n", name)
}

執(zhí)行:

 go run demo5.go 
# command-line-arguments
./demo5.go:6:2: imported and not used: "github.com/Golang_Puzzlers/src/puzzlers/article3/q2/lib" as lib5
./demo5.go:17:2: undefined: lib

第一個(gè)錯(cuò)誤提示的意思是,我們導(dǎo)入了puzzlers/article3/q2/lib包,但沒(méi)有實(shí)際使用其中的任何程序?qū)嶓w。這在 Go 語(yǔ)言中是不被允許的,在編譯時(shí)就會(huì)導(dǎo)致失敗。

注意,這里還有另外一個(gè)線(xiàn)索,那就是“as lib5”。這說(shuō)明雖然導(dǎo)入了代碼包puzzlers/article3/q2/lib,但是使用其中的程序?qū)嶓w的時(shí)候應(yīng)該以lib5.為限定符。這也就是第二個(gè)錯(cuò)誤提示的原因了。Go 命令找不到lib.這個(gè)限定符對(duì)應(yīng)的代碼包。
為什么會(huì)是這樣?根本原因就是,我們?cè)谠创a文件中聲明所屬的代碼包與其所在目錄的名稱(chēng)不同。請(qǐng)記住,源碼文件所在的目錄相對(duì)于 src 目錄的相對(duì)路徑就是它的代碼包導(dǎo)入路徑,而實(shí)際使用其程序?qū)嶓w時(shí)給定的限定符要與它聲明所屬的代碼包名稱(chēng)對(duì)應(yīng)。
有兩個(gè)方式可以使上述構(gòu)建成功完成。我在這里選擇把 demo5_lib.go 文件中的代碼包聲明語(yǔ)句改為package lib。理由是,為了不讓該代碼包的使用者產(chǎn)生困惑,我們總是應(yīng)該讓聲明的包名與其父目錄的名稱(chēng)一致。

解決辦法:

vim lib/demo5_lib.go 
package lib5 //注意,這里lib5修改為lib,與父目錄lib對(duì)應(yīng)

import "fmt"

func Hello(name string) {
        fmt.Printf("Hello, %s!\n", name)
}

執(zhí)行不報(bào)錯(cuò):

$ go run demo5.go 
Hello, everyone!
$ go run demo5.go  -name huaihe
Hello, huaihe!

3. 什么樣的程序?qū)嶓w才可以被當(dāng)前包外的代碼引用?

4.你可能會(huì)有疑問(wèn),我為什么要把 demo5_lib.go 文件中的那個(gè)函數(shù)名稱(chēng)hello的首字母大寫(xiě)?實(shí)際上這涉及了 Go 語(yǔ)言中對(duì)于程序?qū)嶓w訪(fǎng)問(wèn)權(quán)限的規(guī)則。超級(jí)簡(jiǎn)單,名稱(chēng)的首字母為大寫(xiě)的程序?qū)嶓w才可以被當(dāng)前包外的代碼引用,否則它就只能被當(dāng)前包內(nèi)的其他代碼引用。通過(guò)名稱(chēng),Go 語(yǔ)言自然地把程序?qū)嶓w的訪(fǎng)問(wèn)權(quán)限劃分為了包級(jí)私有的和公開(kāi)的。對(duì)于包級(jí)私有的程序?qū)嶓w,即使你導(dǎo)入了它所在的代碼包也無(wú)法引用到它。

4. 對(duì)于程序?qū)嶓w,還有其他的訪(fǎng)問(wèn)權(quán)限規(guī)則嗎?

答案是肯定的。在 Go 1.5 及后續(xù)版本中,我們可以通過(guò)創(chuàng)建internal代碼包讓一些程序?qū)嶓w僅僅能被當(dāng)前模塊中的其他代碼引用。這被稱(chēng)為 Go 程序?qū)嶓w的第三種訪(fǎng)問(wèn)權(quán)限:模塊級(jí)私有。
具體規(guī)則是,internal代碼包中聲明的公開(kāi)程序?qū)嶓w僅能被該代碼包的直接父包及其子包中的代碼引用。當(dāng)然,引用前需要先導(dǎo)入這個(gè)internal包。對(duì)于其他代碼包,導(dǎo)入該internal包都是非法的,無(wú)法通過(guò)編譯。
“Golang_Puzzlers”項(xiàng)目的puzzlers/article3/q4包中有一個(gè)簡(jiǎn)單的示例,可供你查看。你可以改動(dòng)其中的代碼并體會(huì)internal包的作用。

總結(jié)

本篇文章中詳細(xì)討論了把代碼從命令源碼文件中拆分出來(lái)的方法,這包括拆分到其他庫(kù)源碼文件,以及拆分到其他代碼包。這里涉及了幾條重要的 Go 語(yǔ)言基本編碼規(guī)則,
即:代碼包聲明規(guī)則、代碼包導(dǎo)入規(guī)則以及程序?qū)嶓w的訪(fǎng)問(wèn)權(quán)限規(guī)則。在進(jìn)行模塊化編程時(shí),你必須記住這些規(guī)則,否則你的代碼很可能無(wú)法通過(guò)編譯。

文章名稱(chēng):學(xué)習(xí)筆記-go庫(kù)源碼文件
當(dāng)前網(wǎng)址:http://muchs.cn/article38/gphosp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化企業(yè)建站、服務(wù)器托管、微信小程序、網(wǎng)站設(shè)計(jì)域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)