【问题标题】:Local packages are not detected by goimportsgoimports 未检测到本地包
【发布时间】:2018-07-30 20:44:19
【问题描述】:

我的 golang 项目在不同的文件夹中有几个包,这些包变得有点大。我一直在尝试创建单独的包,但没有被 goimports 检测到

GOPATH="/home/malek/go:/home/malek/Desktop/Workspace"
GORACE=""
GOROOT="/usr/local/go"

我的目录就是这样,

Workspace -> src -> application -> utility -> math.go

在我的 math.go 文件夹中,我有包实用程序

但是当我尝试执行 import "application/utility" 或尝试在我的 main.go 文件(在应用程序文件夹中)中包含 math.go 文件中的公共函数时,我得到未定义...

我做错了什么?

【问题讨论】:

  • 你的 GOPATH 中有 2 个部分,什么是“工作区”?也不要设置 GOROOT。
  • 另外,如果“application/utility”是一个合适的包,你应该能够运行go build application/utility而不会出错,或者它可能会提供一些关于你的配置问题的信息。
  • @JimB 它构建时没有消息或错误
  • @JimB:从上下文来看,问题中的GOROOT 值看起来像是go env 输出的一部分。如果 GOROOT 未设置(我没有设置),Go 工具链将其设置为 go 命令的隐式 GOROOT。我有$ echo $GOROOT\n\n$ go env GOROOT\n/home/peter/go\n

标签: go package goimports


【解决方案1】:

您尚未向我们提供重现问题的具体步骤。我看不出有什么问题。 goimports -w main.go 有效。例如,

application/main.gogoimports -w main.go 之前:

package main

import (
    "fmt"
)

func main() {
    fmt.Println(utility.PiE())
}

application/utility/math.go:

package utility

import "math"

func PiE() float64 { return math.Pi * math.E }

命令:

#
cd $HOME
cd $HOME/Desktop/Workspace
rm -f src/application/application
cp src/application/main.bak src/application/main.go
tree
cd $HOME/Desktop/Workspace/src/
cat application/utility/math.go
cd application
export GOPATH=$HOME/gopath:$HOME/Desktop/Workspace
go env GOPATH
cat main.go
go build -a
goimports -w main.go
cat main.go
go build -a && ./application
#

输出:

~$ #
~$ cd $HOME
~$ cd $HOME/Desktop/Workspace
~/Desktop/Workspace$ rm -f src/application/application
~/Desktop/Workspace$ cp src/application/main.bak src/application/main.go
~/Desktop/Workspace$ tree
.
└── src
    └── application
        ├── main.bak
        ├── main.go
        └── utility
            └── math.go

3 directories, 3 files
~/Desktop/Workspace$ cd $HOME/Desktop/Workspace/src/
~/Desktop/Workspace/src$ cat application/utility/math.go
package utility

import "math"

func PiE() float64 { return math.Pi * math.E }
~/Desktop/Workspace/src$ cd application
~/Desktop/Workspace/src/application$ export GOPATH=$HOME/gopath:$HOME/Desktop/Workspace
~/Desktop/Workspace/src/application$ go env GOPATH
/home/peter/gopath:/home/peter/Desktop/Workspace
~/Desktop/Workspace/src/application$ cat main.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println(utility.PiE())
}
~/Desktop/Workspace/src/application$ go build -a
# application
./main.go:8:14: undefined: utility
~/Desktop/Workspace/src/application$ goimports -w main.go
~/Desktop/Workspace/src/application$ cat main.go
package main

import (
    "application/utility"
    "fmt"
)

func main() {
    fmt.Println(utility.PiE())
}
~/Desktop/Workspace/src/application$ go build -a && ./application
8.539734222673568
~/Desktop/Workspace/src/application$ #

application/main.gogoimports -w main.go 之后:

package main

import (
    "application/utility"
    "fmt"
)

func main() {
    fmt.Println(utility.PiE())
}

【讨论】:

  • 我用一个简单的应用程序复制了你的例子:pastebin.com/NagedTLK
  • 哦,还有,调用 go install application/utility 确实给了我一个包
  • 您的 pastebin 输出在 goimports -w main.gocat main.go 步骤之前停止。
  • goimports main.go 等价于 goimports -w main.go 和 cat main.go 而无需更改 main.go,换句话说,goimports -w main.go 也会打印相同的内容。 .. 但是,是的,goimports -w main.go 不导入“应用程序/实用程序”