我有以下文件结构:
.
├── bin
│ └── hello
├── pkg
└── src
└── jacob.uk.com
├── greeting
│ └── greeting.go
└── helloworld.go
5 directories, 3 files
使用以下GOPATH
/Users/clarkj84/Desktop/LearningGo
在/usr/local/go/bin/go install jacob.uk.com
文件夹中执行src
后,我收到错误local import "./greeting" in non-local package
helloworld.go
:
package main;
import "./greeting"
func main() {
}
答案 0 :(得分:34)
在为go install
指定非本地包时,您无法使用本地导入。如果您希望本地导入有效,请先将工作目录更改为src/jacob.uk.com
,然后执行go install
(不指定包)。
当然,如果您提供helloworld.go
,则会收到编译错误:imported and not used
。但是一旦你使用导入的greeting
包中的东西,它就应该编译。
但你根本不应该使用本地进口产品。而是写:
import "jacob.uk.com/greeting"
这样你就可以从任何地方编译/运行/安装它。
答案 1 :(得分:20)
键入go build
不适用于相对导入路径;您必须输入go build main.go
。
go install
根本不适用于相对导入路径。
记录于https://golang.org/cmd/go/#hdr-Relative_import_paths
见
解释。
答案 2 :(得分:3)
您可以在go 1.11中使用replace添加本地软件包。 转到go.mod并使用“ replace”关键字,如下所示(您无需创建github存储库,只需添加以下行即可)
module github.com/yourAccount/yourModule
go 1.15
require (
github.com/cosmtrek/air v1.21.2 // indirect
github.com/creack/pty v1.1.11 // indirect
github.com/fatih/color v1.9.0 // indirect
github.com/imdario/mergo v0.3.11 // indirect
github.com/julienschmidt/httprouter v1.3.0
github.com/mattn/go-colorable v0.1.7 // indirect
github.com/pelletier/go-toml v1.8.0 // indirect
go.uber.org/zap v1.15.0
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a // indirect
)
replace (
github.com/yourAccount/yourModule/localFolder =>"./yourModule/localFolder"
github.com/yourAccount/yourModule/localFolder =>"./yourModule/localFolder"
)
然后在您的main.go =>
import (
alog "github.com/yourAccount/yourModule/localFolder"
slog "github.com/yourAccount/yourModule/localFolder"
)
答案 3 :(得分:0)
可能有几处错误。我将提供以下设置。
GOPATH变量定义您的工作空间。如果键入“ go env
”,则可以轻松识别当前值。
如果在Windows下安装Go,则会在安装过程中自动设置GOPATH环境变量。尽管如此:可能不是您首选的默认路径。您可以根据需要安全地将此变量设置为目标目录。
要在Windows中更改环境变量,请点击此处:https://www.architectryan.com/2018/08/31/how-to-change-environment-variables-on-windows-10/
如果您已确定工作空间应驻留在何处并设置GOPATH环境变量,则应在工作空间内创建三个文件夹:
src,pkg,bin
文件夹“ src”是源代码所在的目录。 “ pkg”包括外部进口。 “ bin”包含已编译的源。
工作空间中的布局:
<workspace directory>
--> src
--> oopexpertutil
--> x.go
--> y.go
--> pkg
--> ...
--> bin
--> ...
文件“ x.go”
package oopexpertutil
func checkMe(e error) {
if e != nil {
panic(e)
}
}
文件“ y.go”
package main
import (
"fmt"
"io/ioutil"
"oopexpertutil"
)
func main() {
var data string = "Hello World!"
var dataAsBytes = []byte(data)
fmt.Println(data)
err := ioutil.WriteFile("hello_world.txt", dataAsBytes, 0644)
fmt.Println(err)
oopexpertutil.checkMe(err)
}
此设置仍然无法使用。您可能已经尝试了所有其他坚持工作区或程序包布局或“转到模块”主题的答案。要完成这项工作的最后一点是:
将引用包的“ checkMe”功能的名称更改为“ CheckMe”并更新用法...
Go有一些约定,可从软件包 未导出函数 中识别 导出函数 >以大写字母开头 。
答案 4 :(得分:-1)
您可以使用供应商功能绕过此功能
将import "./greeting"
更改为import "greeting"
创建供应商目录mkdir vendor
并创建符号链接ln -s ../greeting vendor/greeting
答案 5 :(得分:-1)
如果您只想在单独的文件而不是单独的程序包之间共享代码,请按以下步骤操作:
您不需要import
,只需将源文件放在相同的目录中,并在每个文件的顶部指定相同的package
名称,然后就可以访问所有文件。公开(大写)函数和类型,方法是直接引用它们,即SomeFunction()
而不是somepackage.SomeFunction()