[已解决]Golang添加第二个*.go文件后无法找到包的问题
[已解决]Golang添加第二个*.go文件后无法找到包的问题 大家好,
我昨天刚开始学习Go,并创建了一个包含简单结构体类型的包。今天在浏览GitHub上的一个库时,我发现同一个包中的不同Go文件可以复用结构体类型,而无需重新声明。
出于测试目的,我在同一个包中创建了一个新的*.go文件,并编写了一个打印函数,用于显示我在同一包内另一个*.go文件中创建的结构体类型。现在尝试使用时,编译器报错说在GOROOT或GOPATH中找不到该包。
于是,我重新开始,在一个新包中创建了结构体类型和打印函数,并将它们放入另一个包的新*.go文件中,现在尝试使用时遇到了和之前一样的错误。实际上,我现在创建的任何包都会出现这个错误。
我查阅了网络资料,修改了环境变量,但在编译时仍然出现这个错误信息。所以我有点不知所措。
提前感谢您的帮助。
更多关于[已解决]Golang添加第二个*.go文件后无法找到包的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你能提供一个包含失败代码完整示例的压缩包或zip文件吗?
更多关于[已解决]Golang添加第二个*.go文件后无法找到包的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
如果我只在gopath中有这个文件夹,编译器就会报错……不知道为什么我的Windows上的Go编译器会出现这个错误。
或许展示一些代码以及你组织文件的方式的草稿。
同时请注意,package main 有些特殊,通常不会自动包含其他文件。
好的,虽然很奇怪,但问题解决了。我把 own/smt 这个包复制到了 goroot/src 目录下,现在它可以正常工作了。这确实让人非常困惑。
Christophe_Meessen:
当查找包时,它们是相对于 main.go 文件进行查找的。
不,相对查找仅在你指定以一个或两个点开头的相对包路径时才使用。
Eyfenna:
一个名为 test.go 的文件
不要这样命名你的文件。以 test 结尾的文件名会被编译器忽略,除非你正在运行测试…
另外,当编译器抱怨找不到包时,请仔细比较实际路径和错误消息中的路径。
好的,谢谢你的建议。
我在 src/own 目录下创建了一个名为 smt 的文件夹。
当我使用这个路径时,编译器仍然报出同样的错误。我检查了名称,从控制台复制了文件路径并修正了反斜杠,但错误仍然出现。
不要这样做!
GOROOT 不是用来存放你的东西的,那是用于存放Go发行版中包含的内容的!
你只需要使用 GOPATH!
除此之外…
我将文件解压到我的 ${GOPATH}/src 目录下,然后执行 go build hello3/hello.go 命令“成功”了,但提示“已导入但未使用”…
如你所愿:
https://drive.google.com/file/d/1PFGljQC76C47BkU7KxnFlE2wUQFTFJT1/view?usp=sharing
我已将所有文件解压到 gopath/src 目录下。
也许你的 GOPATH 并不是你以为的那样……能否请你提供完整的错误信息,以及你文件的完整路径?
另外,请将文件从 GOROOT 中移除,它们不属于那里。
Eyfenna: 嗯,在 gopath 里,也就是 %user%/go/src
这与默认设置不同,Windows 的默认设置似乎是 %USERPROFILE%/go。src 通常不是 GOPATH 的一部分,而是三个子文件夹之一。
问题是导入路径。它应该是
import "packtest"
当查找包时,它们是相对于 main.go 文件进行查找的。由于 main.go 旁边没有 own 目录,Go 会在 GOPATH 和 GOROOT 目录中查找,这会导致失败。
编辑:仅当导入路径以一个或两个点开头时,上述情况才成立。然后你可以使用以下方式
import "./packtest"
在GOPATH(即%user%/go/src)中,我有一个名为own的文件夹,其中包含一个名为packtest的文件夹,该文件夹内有一个名为test.go的文件,其代码如下:
package pt
type Test struct{
testword string
}
编译这段代码没有问题。但是,当我在GOPATH的hello文件夹中编写一个hello.go文件,其代码如下:
package main
import “own/packtest”
func main(){
}
编译器没有抱怨我未使用导入的包,而是报错:
hello.go:3:8: cannot find package “own/packtest” in any of:
GOROOT
GOPATH
编辑:已卸载并重新安装Go,错误信息依旧。
根据你的描述,这个问题通常是由于包声明或文件组织方式不正确导致的。以下是具体的解决方案和示例代码:
1. 检查包声明
确保所有在同一个包中的文件都使用相同的包名。
示例结构:
project/
├── main.go
└── mypackage/
├── structs.go
└── printer.go
structs.go:
package mypackage
type Person struct {
Name string
Age int
}
printer.go:
package mypackage // 必须与structs.go的包名相同
import "fmt"
func PrintPerson(p Person) {
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}
2. 检查导入路径
确保导入路径正确,特别是使用模块时。
main.go:
package main
import (
"fmt"
"your-module-name/mypackage" // 替换为你的模块名
)
func main() {
p := mypackage.Person{
Name: "John",
Age: 30,
}
mypackage.PrintPerson(p)
}
3. 初始化Go模块
如果还没有初始化模块,需要先运行:
go mod init your-module-name
这会创建go.mod文件,其中your-module-name应该是你的项目名称。
4. 完整示例
项目结构:
myproject/
├── go.mod
├── main.go
└── mypackage/
├── structs.go
└── printer.go
go.mod:
module myproject
go 1.21
mypackage/structs.go:
package mypackage
type Person struct {
Name string
Age int
}
mypackage/printer.go:
package mypackage
import "fmt"
func PrintPerson(p Person) {
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}
main.go:
package main
import (
"myproject/mypackage"
)
func main() {
p := mypackage.Person{
Name: "Alice",
Age: 25,
}
mypackage.PrintPerson(p)
}
5. 运行命令
在项目根目录执行:
go run main.go
如果问题仍然存在,请检查:
- 所有
.go文件是否在正确的目录中 - 包名是否一致
- 导入路径是否正确
- 是否在正确的目录中运行
go run命令


