[已解决]Golang添加第二个*.go文件后无法找到包的问题

[已解决]Golang添加第二个*.go文件后无法找到包的问题 大家好,

我昨天刚开始学习Go,并创建了一个包含简单结构体类型的包。今天在浏览GitHub上的一个库时,我发现同一个包中的不同Go文件可以复用结构体类型,而无需重新声明。

出于测试目的,我在同一个包中创建了一个新的*.go文件,并编写了一个打印函数,用于显示我在同一包内另一个*.go文件中创建的结构体类型。现在尝试使用时,编译器报错说在GOROOT或GOPATH中找不到该包。

于是,我重新开始,在一个新包中创建了结构体类型和打印函数,并将它们放入另一个包的新*.go文件中,现在尝试使用时遇到了和之前一样的错误。实际上,我现在创建的任何包都会出现这个错误。

我查阅了网络资料,修改了环境变量,但在编译时仍然出现这个错误信息。所以我有点不知所措。

提前感谢您的帮助。


更多关于[已解决]Golang添加第二个*.go文件后无法找到包的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

你能提供一个包含失败代码完整示例的压缩包或zip文件吗?

更多关于[已解决]Golang添加第二个*.go文件后无法找到包的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


尝试使用 go run ./... 来运行它。

(点和斜杠之间没有空格)

如果我只在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%/gosrc 通常不是 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命令
回到顶部