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

问题描述 投票:25回答:3

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

目录结构示例:

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

go编译器需要包main和func main来开始执行。我的库需要包myproject,我把东西放在上面。当我构建另一个试图导入myproject的项目时,这就是go工具所说的:

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

所以我相信没有办法做到这一点。

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

go packages
3个回答
18
投票

只需将您的包移到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


17
投票

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

来自How to write go code

Go代码必须保存在工作区内。工作空间是一个目录层次结构,其根目录有三个目录:

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

pkg包含包对象,和

bin包含可执行命令。


2
投票

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

工作实例:

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

mypackage文件夹:

mypackage/
  foo.go
  foo_test.go

我的天使/ Fuoo。请:

package mypackage

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

mypackage中/ foo_test.go:

package mypackage_test

// Unit tests...

规则:

  1. 2个包必须具有以下名称: NameOfDirectory。 NameOfDirectory + _test
  2. _test包中的文件名必须以_test.go结尾

如果您在found packages "foo" and "bar"的行中收到令人困惑的编译器错误,那么您可能已经破坏了这些规则中的一个或多个。

© www.soinside.com 2019 - 2024. All rights reserved.