在同一个目录中有两个包有意义吗?

Posted

技术标签:

【中文标题】在同一个目录中有两个包有意义吗?【英文标题】:Does it make sense to have two packages in the same directory? 【发布时间】:2013-12-24 00:57:27 【问题描述】:

我有一个项目,它提供了一个库(导出一些函数),还必须提供一个命令行界面(必须有一个可执行文件)。

目录结构示例:

whatever.io/
    myproject/
        main.go
        myproject.go

go 编译器需要 package mainfunc main 来开始执行。我的库需要 package myproject 我在上面放东西的地方。这是我在构建另一个尝试导入 myproject 的项目时 go 工具所说的:

main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject

所以我相信没有办法。

我应该将库或 CLI 移动到另一个包吗?

【问题讨论】:

【参考方案1】:

只需将您的包移动到 main.go 同一目录中的新文件夹中。 记得从 $GOPATH 的引用中导入新包。

例子:

user@user:~/p/go/test/so-multipack$ ls -R
.:
a  main.go

./a:
a.go
user@user:~/p/go/test/so-multipack$ cat main.go 
package main

import (
    "../so-multipack/a"
)
func main()
    a.Hello()

user@user:~/p/go/test/so-multipack$ cat a/a.go 
package a
import (
    "fmt"
)
func Hello()
    fmt.Println("hello from a")

user@user:~/p/go/test/so-multipack$ go run main.go 
hello from a
user@user:~/p/go/test/so-multipack$ go build 
user@user:~/p/go/test/so-multipack$ ls
a  main.go  so-multipack
user@user:~/p/go/test/so-multipack$ 

有用的链接:

go build vs go build file.go

【讨论】:

所以基本上是的,我应该移动它。谢谢。 @xrash,但请考虑将命令代码中的导入更改为whatever.io/myproject——不要使用相对导入(例如,参见this discussion,以及它包含的指针)。 只有当每个包都在自己的目录中并且从 GOPATH 中引用时,相对路径才可以。否则go build 可能会失败。 听起来如此简单如此简单......但当你以某人的 .proto 文件为例并尝试构建 GO 文件时却不是这样:\【参考方案2】:

每个目录不能有两个包,因此会出现错误。所以@Larry Battle 的解决方案是把你的myproject.go 移动到一个新目录。

来自How to write go code

Go 代码必须保存在工作区中。工作区是一个目录 根目录下包含三个目录的层次结构:

src 包含组织成包的 Go 源文件(每个目录一个包),

pkg 包含包对象,并且

bin 包含可执行命令。

【讨论】:

有一个异常github.com/golang/go/blob/master/src/time/example_test.go 您引用的链接已删除声明“(每个目录一个包)” @yuxh:在概述部分“每个包都包含一个或多个 Go 源文件在一个目录中。”【参考方案3】:

在大多数情况下,。但是,单元测试有一个例外

工作示例:

这里有 2 个不同的包(mypackagemypackage_test)在 1 个目录 (mypackage) 中。编译器不会抱怨这个。

我的包文件夹:

mypackage/
  foo.go
  foo_test.go

mypackage/foo.go:

package mypackage

func Add(a int, b int) int 
    return a + b

mypackage/foo_test.go:

package mypackage_test

// Unit tests...

规则:

    这 2 个包必须具有以下名称:

    目录名称。 NameOfDirectory + _test.

    _test 包中的文件名必须以_test.go 结尾

如果您收到类似于 found packages "foo" and "bar" 的令人困惑的编译器错误,则您可能违反了这些规则中的一个或多个。

【讨论】:

unittest "package" 代码不会被编译成非unittest package 代码。所以不存在打包冲突。 但是 Go 测试说 - 要编写一个新的测试套件,请创建一个名称以 _test.go 结尾的文件,其中包含 ) 函数,如此处所述。将文件放在与被测试文件相同的包中。 @AananthK 文档有点过时了;它缺少一些关于 _test 包成语的信息。这是github issue 讨论您引用的文档。 感谢@byxor 提供的信息【参考方案4】:

你不能在一个目录中有两个 golang 文件和两个包。所以你需要把main.go移出myproject

移动前的目录结构

whatever.io/
    go.mod
    myproject/
        main.go
        myproject.go

移动后

​​>
whatever.io/
    go.mod
    main.go
    myproject/
        myproject.go

您需要更改main.go 的导入路径。如果模块名是aaa

之前

import "aaa"

需要修改

import "aaa/myproject"

【讨论】:

以上是关于在同一个目录中有两个包有意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

覆盖ActiveRecord子类中的'=='方法有意义吗?

软考有意义吗?软考容易过吗?

软考有意义吗?软考容易过吗?

如果(!这个)返回; 在 C# 中有意义吗?

这个 Python 表达式有意义吗?

负载平衡在单个硬件服务器上有意义吗?