我试图理解包的工作方式在golang实际执行的方面更好,而不是通常做的或被认为是好的做法(我们以后也可以谈谈好的做法,但我希望先了解一下)。
来自effective go它说:
"另一个惯例是包名是其源目录的基本名称......"
然而,上述描述似乎并未被go或required强迫。因此,我想知道,如果我被允许在相同目录库的顶部有多个文件,其中包含不同的包声明。如果允许我在同一目录中有多个包声明,那么如何导入它们并在同一个文件中单独使用它们?基本上,我想我遇到的问题之一是由于一些go教程/文档的措辞。如果是按惯例,那么对我来说,它暗示不是由语言强制执行。因为,例如,程序员不按惯例为函数编写关键字func
。我们写func
因为否则go会对你大喊大叫,不编译。因此,我希望用下面的示例澄清这一点(如果可能的话,更改go的文档,因为在我看来这是一个大问题,如何做到这一点?)。
例如说我有三个文件A.go
,B.go
,C.go
,它们分别打印a,b,c打印打印函数Print()
。它们都位于名为maybe base
的同一个基目录中。然后每个都有一个不同的包声明package Apkg, package Bpkg, package Cpkg
。
你怎么去导入它们?下面会有什么工作吗?
package main
import(
nameA "github.com/user_me/base/Apkg"
nameB "github.com/user_me/base/Bpkg"
nameC "github.com/user_me/base/Cpkg"
)
func main() {
nameA.Print() \\prints a
nameB.Print() \\prints b
nameC.Print() \\prints c
}
或者我们甚至不需要指定名称,如果包裹名称是顶部已经不同:
package main
import(
"github.com/user_me/base"
)
func main() {
Apkg.Print() \\prints a
Bpkg.Print() \\prints b
Cpkg.Print() \\prints c
}
打印文件是:
A.go:
//file at github.com.user_me/base and name A.go
package Apkg
import "fmt"
func Print(){
fmt.Println("A")
}
B.go:
//file at github.com.user_me/base and name B.go
package Bpkg
import "fmt"
func Print(){
fmt.Println("B")
}
C.go: //文件在github.com.user_me / base和名称C.go 包Cpkg
import "fmt"
func Print(){
fmt.Println("C")
}
此外,如果您可以从base
获得不同的名称,有人可以向我说明导入是如何实际完成的吗?如果包名称为package Apkg
,则导入必须为import github.com/user_me/base
或import github.com/user_me/base/Apkg
或github.com/user_me/Apkg
。
我还没有测试过这个,但我很快就会这样做。进入的交易对我来说有点混乱,并希望得到答案并与全世界分享。
答案 0 :(得分:7)
不,它是每个文件夹的1个包,所以你必须拥有它们:
$GOPATH/src/github.com/user_me/base/Apkg/a.go
$GOPATH/src/github.com/user_me/base/Bpkg/b.go
$GOPATH/src/github.com/user_me/base/Cpkg/c.go
你甚至无法建立它:
┌─ oneofone@Oa [/t/blah]
└──➜ go build
can't load package: package .: found packages pkgA (blah1.go) and pkgB (blah2.go) in /tmp/blah
您的软件包名称不需要与它们所在的目录具有相同的名称,但是一个目录中的所有文件必须具有相同的软件包名称。
此外,您可以在导入时重命名包,例如:
import (
cr "crypto/rand"
mr "math/rand"
)
或者你的图书馆被称为主要(坏主意btw):
import m "github.com/user_me/base/main"