GO (Golang) 在同一目录中看不到其他 .go 文件

问题描述 投票:0回答:1

问题:从其他包导出的函数未定义,在 main.go 内部不可见

解决方案:main.go 放入 单独的文件夹(将其命名为 app 或 main,没关系)。只有 go.mod 保留在根目录中,其中包含文件夹“app”和“package1”“package2”等。在此 VSCode 在保存时自动添加导入之后,我什至不需要执行任何操作。如果我在 root 中有 main.go 那么它不起作用(大多数时候),因为它没有“看到”其他模块的函数(未定义)。

我找到了解决方案这里,(参见davidbost的帖子)。 Andrey Dyatlov 本页上的解决方案也工作了一段时间,然后停止工作。

我大概花了 10 个小时的尝试、错误和搜索。 希望以上内容对其他人有帮助。谢谢大家!

_____________________________________________________________________________

原问题描述:

Windows 10、Go 1.17、带有 Go 扩展的 VS Code。

您好,我是 Go 新手,由于以下问题,我无法遵循单个教程。当我在与 main.go 相同的目录(或同一目录的文件夹内)创建另一个 .go 文件时,我收到错误消息 .\main.go:7:2: undefined: SayHi


main.go 文件:

package main

import "fmt"

func main() {
    fmt.Println("1st")
    SayHi()
}

/something 文件夹中的另一个 .go 文件:

package something

import "fmt"

func SayHi() {
    fmt.Println("Hi!")
}

运行 go run main.go 会导致未定义的 SayHi 错误

我用谷歌搜索了这个问题,但没有运气。

$ go build // 给出相同的错误

$ go install // 给出同样的错误

不使用其他文件中的函数 $ go run main.go 运行得很好。

我还尝试了 go init 添加我的 github 目录,但没有成功(按照教程)。我还尝试了官方的启动指南go run init,导出的Capitalized函数仍然未定义。更糟糕的是 SayHi 函数的自动完成功能可以工作,但由于未定义而无法编译。

我已将 PATH 设置为 C:\Users\xxx\go 并将我的文件放在那里,我也尝试使用 C:\Go 但没有成功,它仍然是未定义的。我快要放弃Go了...

go import undefined
1个回答
5
投票

如果不知道项目的当前状态,就很难修复它。请尝试从头开始:

  1. $GOPATH
    之外的任意位置为您的项目创建一个目录:

    mkdir myproject
    cd myproject
    
  2. 运行以下命令创建一个

    go.mod
    文件,用于描述您的项目(模块)及其依赖项;我们将该模块称为
    github.com/me/myproject
    :

    go mod init github.com/me/myproject
    
  3. 创建第一个文件;让我们称之为

    main.go

    package main
    
    import "fmt"
    import "github.com/me/myproject/something"
    
    func main() {
        fmt.Println("1st")
        something.SayHi()
    }
    
  4. 为名为

    github.com/me/myproject/something
    的包创建一个目录:

    mkdir something
    
  5. 创建一个带有路径的文件

    something/something.go
    :

    package something
    
    import "fmt"
    
    func SayHi() {
        fmt.Println("Hi!")
    }
    
  6. myproject
    目录中,运行
    go build

  7. 启动你的第一个 Go 程序:

    ./myproject
    1st
    Hi!
    
© www.soinside.com 2019 - 2024. All rights reserved.