包如何在golang中工作

时间:2014-06-20 19:53:53

标签: import go package

我试图理解包的工作方式在golang实际执行的方面更好,而不是通常做的或被认为是好的做法(我们以后也可以谈谈好的做法,但我希望先了解一下)。

来自effective go它说:

  

"另一个惯例是包名是其源目录的基本名称......"

然而,上述描述似乎并未被go或required强迫。因此,我想知道,如果我被允许在相同目录库的顶部有多个文件,其中包含不同的包声明。如果允许我在同一目录中有多个包声明,那么如何导入它们并在同一个文件中单独使用它们?基本上,我想我遇到的问题之一是由于一些go教程/文档的措辞。如果是按惯例,那么对我来说,它暗示不是由语言强制执行。因为,例如,程序员不按惯例为函数编写关键字func。我们写func因为否则go会对你大喊大叫,不编译。因此,我希望用下面的示例澄清这一点(如果可能的话,更改go的文档,因为在我看来这是一个大问题,如何做到这一点?)。

例如说我有三个文件A.goB.goC.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/baseimport github.com/user_me/base/Apkggithub.com/user_me/Apkg

我还没有测试过这个,但我很快就会这样做。进入的交易对我来说有点混乱,并希望得到答案并与全世界分享。

1 个答案:

答案 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"