亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中,包名是否必須與最里面的目錄名相同?

在 Go 中,包名是否必須與最里面的目錄名相同?

Go
喵喵時光機 2022-06-13 16:05:35
注意這個問題是關于 Go 語言規范而不是最佳實踐或推薦??戳撕芏喟奈恼拢€是不太明白目錄和包名的關系。這是我的例子。我的項目結構如下圖所示。當我這樣做時go run ~/go/src/myproj/main.go,錯誤說:src\myproj\main.go:5:2: 在以下任何位置都找不到包“myproj/pa/pb”:c:\go\src\myproj\pa\pb(來自 $GOROOT)C:\Users\terry\ go\src\myproj\pa\pb(來自 $GOPATH)但是,如果我在 p.go 中更改package pb為package pa,并將導入從更改"myproj/pa/pb"為"myproj/pa",然后在 main.go 中更改fmt.Print(pb.Greet)為fmt.Print(pa.Greet),它將起作用。最里面的目錄是否必須與包聲明名稱匹配?我的 go 版本是 1.14.4
查看完整描述

4 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

在 go 中,約定是包的名稱應該與其源目錄的名稱相同。

例如,以下是Effective Go 博客的摘錄:

另一個約定是包名是其源目錄的基名;src/encoding/base64 中的包被導入為“encoding/base64”,但名稱為 base64,不是 encoding_base64,也不是 encodingBase64。

這具有單個目錄僅包含一個包的效果。它在圍棋中是如此基礎,您可以將其視為固定規則,盡管從技術上講,它只是一個約定。


查看完整回答
反對 回復 2022-06-13
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

在 Go 中,包名必須與最里面的目錄名相同嗎?

它不必相同,但它是一個常見的約定。除非你有充分的理由,否則你不應該偏離它。

如果你想要一個不同的包名和目錄名,你可以在文件的包子句中使用 import 注釋。

package <package_name> // import "<import_path>"

這很有用,您的文件結構不利于描述性名稱,例如,如果在文件路徑中使用多個版本。

例如,Google 的客戶端 SDK 使用如下路徑:

  • 包裹名字:slides

  • 導入路徑:google.golang.org/api/slides/v1

為了支持這一點,文件的包子句如下:

package slides // import "google.golang.org/api/slides/v1"

這樣一來,在調用代碼中就可以進行如下操作,看起來合情合理。

package main


import(

    "google.golang.org/api/slides/v1"

)


func main() {

    fmt.Println(slides.PresentationsScope)

}

在此處查看更多信息:https ://github.com/googleapis/google-api-go-client/blob/master/slides/v1/slides-gen.go


在此處的示例中,您將使用:


package pb // import "myproj/pa"

如果您不使用包子句方法,編輯器可能會自動為您的代碼添加別名,例如:


import pb "myprog/pa"


查看完整回答
反對 回復 2022-06-13
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

包名不必是包目錄的基礎。go 工具 goimports 在清理源文件的導入時,實際上會采用包名稱并將其顯示為導入的別名,如果它與基礎不匹配 - 使導入代碼看起來更有意義但別名不是必需的 - 沒有它,文件將編譯。查看包的 AST 時, *types.Package 有一個 Name 方法,它返回包名。當使用 golang.org/x/tools/go/packages.Load 函數加載包時,返回的 *packages.Package 有一個 Name 屬性,該屬性也返回包名。這在按程序生成代碼時非常有用。



查看完整回答
反對 回復 2022-06-13
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

經過一些試驗和錯誤,我發現了發生了什么。包名稱必須與最里面的目錄名稱相同?不。


main.go只需執行以下操作即可。


package main


import (

    "fmt"

    "myproj/pa"

)


func main() {

    fmt.Print(pb.Greet)

}

我們也可以給它一個別名,如下所示也可以。


package main


import (

    "fmt"

    pc "myproj/pa"

)


func main() {

    fmt.Print(pc.Greet)

}

所以這意味著,go 中的 package 是一個帶有package xxx聲明的文件目錄。目錄名稱在導入過程中很重要。該目錄是導入路徑的一部分。但是在導入的文件中使用的是 xxx inpackage xxx或該 xxx 的別名。


當然,不建議做這種事情,但最好的做法還是不要這樣做來迷惑人。


查看完整回答
反對 回復 2022-06-13
  • 4 回答
  • 0 關注
  • 792 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號