6

我正在尝试在 Go 中制作一个简单的计算器。我正在以这样一种方式设计它,即我可以先构建一个命令行界面并轻松地在 GUI 界面中交换。项目位置是$GOPATH/src/gocalc(以下所有路径均相对于项目位置)。命令行界面逻辑存储在一个文件中gocalc.go。计算器逻辑存储在文件calcfns/calcfns.gooperations/operations.go. 所有文件的包名与其文件名(无扩展名)相同,但主程序 ,gocalc.go位于package main

calcfns.gooperations.go通过进口import "gocalc/operations"; 通过gocalc.go进口calcfns.goimport "gocalc/calcfns"

总结一下:

  • $GOPATH/src/gocalc/
    • gocalc.go
      • package main
      • import "gocalc/calcfns"
    • calcfns/
      • calcfns.go
        • package calcfns
        • import "gocalc/operations"
    • operations/
      • operations.go
        • package operations

当我尝试go build operations(从项目目录)时,我得到响应:can't load package: package operations: import "operations": cannot find package 当我尝试go build gocalc/operations时,我得到can't load package: package gocalc/operations: import "gocalc/operations": cannot find package 当我尝试go build operations/operations.go时,它编译得很好

当我尝试go build calcfnsorgo build gocalc/calcfns时,我收到can't load package...消息,类似于操作中的消息;但是,当我尝试构建calcfns/calcfns.go它时,import 语句会阻塞:import "gocalc/operations": cannot find package

最后,当我go build .从项目目录尝试时,它与上一段类似:import "gocalc/calcfns": cannot find package

go build我应该如何以不会失败的方式构建我的子包和/或导入语句?

4

3 回答 3

7

愚蠢的是,我忘记导出我的 GOPATH 变量,所以go env显示""GOPATH. (感谢 jnml 建议打印go env;+1)。

完成此操作(并将主程序移动到其自己的文件夹{project-dir}/gocalc/gocalc.go)后,我可以通过go install gocalc/gocalc.

故事的寓意,请确保您键入export GOPATH=...而不是仅GOPATH=...在设置 $GOPATH 环境变量时

于 2013-01-19T18:46:38.690 回答
1

请尝试添加输出$ go env以提供更多线索。否则,目录结构和(显示的)导入语句看起来都不错。

然而这句话

当我尝试进行构建操作(从项目目录)时,我得到响应:无法加载包:包操作:导入“操作”:找不到包

听起来很奇怪。这似乎表明你有

package operations

import "operations"

在“operations.go”中,那将是罪魁祸首......?

于 2013-01-19T18:28:30.893 回答
-1

很容易:

假设我有一个名为:golang-playground

  1. GOPATH/src/在我的情况下,将您的根目录放在下面GOPATH=~/go/src(运行命令go env以获取您的GOPATH)。所以我的应用程序的完整路径是~/go/src/golang-playground 在此处输入图像描述

  2. 假设您想Index()在文件中使用函数:router.go来自我的main.go文件(当然位于根目录上)。所以在 main.go 中:

    import (
        ...
        "golang-playground/router"
    )
    
    func main() {
        foo.Bar("/", router.Index) // Notice caps means its public outside of file
    }
    
于 2017-10-21T17:06:30.520 回答