包如何在golang中工作

Cha*_*ker 10 import package go

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

有效开始说:

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

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

例如说我有三个文件A.go,B.go,C.go打印打印功能Print(),简单地打印出A,B,C分别.它们都位于同一个名为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
}
Run Code Online (Sandbox Code Playgroud)

或者我们甚至不需要指定名称,如果包装状态的顶部已经不同:

package main

import(
    "github.com/user_me/base"
)

func main() {
    Apkg.Print() \\prints a
    Bpkg.Print() \\prints b
    Cpkg.Print() \\prints c
}
Run Code Online (Sandbox Code Playgroud)

打印文件是:

前:

//file at github.com.user_me/base and name A.go
package Apkg

import "fmt"

func Print(){
    fmt.Println("A")
}
Run Code Online (Sandbox Code Playgroud)

B.go:

//file at github.com.user_me/base and name B.go
package Bpkg

import "fmt"

func Print(){
    fmt.Println("B")
}
Run Code Online (Sandbox Code Playgroud)

C.go://文件在github.com.user_me/base和名称C.go包Cpkg

import "fmt"

func Print(){
    fmt.Println("C")
}
Run Code Online (Sandbox Code Playgroud)

另外,如果你能有一个名称不同base,可能有人澄清我如何的进口实际上是做了什么?如果包名称是package Apkg基数,则导入必须是import github.com/user_me/baseimport github.com/user_me/base/Apkggithub.com/user_me/Apkg.

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

One*_*One 8

不,每个文件夹是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
Run Code Online (Sandbox Code Playgroud)

你甚至不能建立它:

?? oneofone@Oa [/t/blah]                                                                                                         
???? go build
can't load package: package .: found packages pkgA (blah1.go) and pkgB (blah2.go) in /tmp/blah
Run Code Online (Sandbox Code Playgroud)

您的包名称不需要与它们所在的目录具有相同的名称,但是一个目录中的所有文件必须具有相同的包名称.

此外,您可以在导入时重命名包,例如:

import (
   cr "crypto/rand"
   mr "math/rand"
)
Run Code Online (Sandbox Code Playgroud)

或者你的图书馆被称为主要(坏主意btw):

import m "github.com/user_me/base/main"
Run Code Online (Sandbox Code Playgroud)

  • @CharlieParker严格来说**语言**没有强制执行它,**构建工具**.通过直接调用编译器/链接器而没有1个包/每个目录限制,编写一个自定义Makefile来编译Go是完全可能的.但是"go build"是如此整合到Go中,语言*也可以强制执行它. (3认同)
  • 您的包名称不必与目录名称匹配但是目录中的所有文件都必须具有相同的包名称.您也可以在导入中重命名包,例如,您可以使用`import(cr"crypto/rand"; mr"math/rand")`. (2认同)