Golang中无法将包变量导入到主包的问题

Golang中无法将包变量导入到主包的问题 我正在尝试从“custom”包中获取值,该包位于 %GOPATH%/src/custom/custom.go,并在 main.go 文件中打印这些值。我已在 VS Code 中安装了 Go 扩展。由于包未正确导入,扩展会移除导入语句。

我不明白为什么这不起作用。我检查了 %GOPATH%,它看起来是这样的:F:\Super\Super\Workspace

我的 src 文件夹结构如下: image

package main

import (
    "fmt"
    "log"
    "custom"
)

func main() {
    log.Println("gotest")
    fmt.Println("text", custom.varone)
}

package custom

const (
    varone = "testing"
    vartwo = "golang"
)

更多关于Golang中无法将包变量导入到主包的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

变量名应以大写字母开头,以便能够被导出。

Varone = "testing"

Vartwo = "golang"

更多关于Golang中无法将包变量导入到主包的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,我改成了大写。我的自定义包看起来是这样的。但我仍然收到那个错误。

package custom

const (
	Varone = "testing"
	Vartwo = "golang"
)

它本应正常工作,但错误信息显示:

# command-line-arguments
.\main.go:12:22: undefined: custom.Varone

在我将第一个字母改为大写之后。

是的,这就是我一直以来的做法 在 VSCode 中 image

非常感谢。抱歉回复晚了。根据您的建议,我选择了使用 Go 模块。我之前甚至在官方的 Go 沙箱中见过并尝试过 Go 模块。但在当前的安装环境中,它在 VSCode 上无法正常工作。目前,我已在 Linux 中设置了一个虚拟机。Go 在 VSCode 中似乎运行得很好。

感谢两位的尝试帮助。但这仍然无法解决问题。也许将来我能自己找出这个问题的原因。我使用的是 go 版本 go1.15.3 windows/amd64。

image

just_started:

.\main.go:12:22: undefined: custom.Varone

custom 包内的 VaroneVartwo 也必须重命名为大写。否则,它们将不被视为已导出供他人使用。

您遇到的错误是编译器正在从 custom 包中寻找 Varone,但它不可用。

导入和导出的符号名称必须完全匹配。

引用 hollowaykeanho:

pwd # 或者 “echo %CD%” 或类似的命令。基本上就是列出你当前的目录。我不是Windows用户 =)

是这个输出吗?

编辑:

引用 just_started:

F:\Super\Super\Workspace\src>go env

另外,你能使用 Visual Code 内部的终端吗?这应该和你执行 go run main/main.go 的是同一个终端。

你好,我之前错误地发帖时没有在路径中添加 /src/,现在我已经编辑了帖子。这就是我之前组织custom.go文件的方式,并且按照你所说的,在$GOPATH/src/custom/custom.go` 中将变量的首字母改为了大写。但错误仍然提示这个。我没有使用 Go 模块。

go run main.go
# command-line-arguments
.\main.go:12:22: undefined: custom.Varone

另一个可能的问题是Go无法找到/加载你的自定义包。

Go首先在$GOROOT/src(包含Go的内置包)中搜索包,然后在$GOPATH/src中搜索。

为了使你能够按照你想要的方式导入自定义包,你的自定义包应该位于: $GOPATH/src/custom/custom.go

在custom.go中,你需要指定包名,并且对于你想要导出的内容,其名称的首字母应大写:

package custom

const (
	Varone = "testing"
	Vartwo = "golang"
)

请注意,如果你使用Go模块,这将不起作用,因为模块处理依赖的方式不同。

(编辑)本应在主题下回复,但点错了回复按钮。

在我上次回复后,我初始化了 go mod,所以环境变量中现在有 gomod 路径。这是我得到的结果:

F:\Super\Super\Workspace\src>go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\user\AppData\Local\go-build
set GOENV=C:\Users\user\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=F:\Super\Super\Workspace\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=F:\Super\Super\Workspace
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=c:\go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=c:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\user\AppData\Local\Temp\go-build551321694=/tmp/go-build -gno-record-gcc-switches

好的,我在我的笔记本电脑上测试了你的源代码,运行正常,无论是在 GO111MODULE 设置为 auto 还是 off 模式下。所以你的代码本身没有问题。这归结为另外两种可能性:

  1. 你的整个工作区不在 GOPATH 内,并且你没有使用 Go 模块。
  2. 配置错误 / 编辑器故障。
终端测试输出
u0:src$ tree $GOPATH/src
/home/u0/go/src
├── custom
│   └── custom.go
└── main
    └── main.go

以 GO111Module off 模式运行:

u0:src$ export GO111MODULE=off
u0:src$ go run main/main.go
2020/11/05 11:39:51 gotest
text testing

以 GO111Module auto 模式运行:

u0:src$ export GO111MODULE=
u0:src$ go run main/main.go
2020/11/05 11:40:44 gotest
text testing
详细源代码

custom.go 的内容:

u0:src$ cat custom/custom.go
package custom

const Varone = "testing"
const Vartwo = "golang"

main.go 的内容:

package main

import (
        custom "custom"
        "fmt"
        "log"
)

func main() {
        log.Println("gotest")
        fmt.Println("text", custom.Varone)
}

让我们来排除第一种可能性。你能在你的编辑器中输入以下命令并说明输出结果吗?

> pwd     # 或者 "echo %CD%" 等类似的命令。基本上就是列出你当前的目录。我不是 Windows 用户 =)
...
> go env
...

这是一个典型的Go模块导入问题。根据你的描述,问题在于没有正确初始化Go模块。以下是解决方案:

1. 初始化Go模块

首先在你的项目根目录(包含main.go的目录)执行:

go mod init your-project-name

这会创建go.mod文件,定义你的模块。

2. 使用相对路径导入

修改你的main.go文件:

package main

import (
    "fmt"
    "log"
    "./custom"  // 使用相对路径
)

func main() {
    log.Println("gotest")
    fmt.Println("text", custom.Varone)  // 注意:导出变量需要大写开头
}

3. 修改custom包

Go中只有大写开头的标识符才能被导出:

package custom

const (
    Varone = "testing"  // 大写V才能被导出
    Vartwo = "golang"   // 大写V才能被导出
)

4. 完整示例结构

your-project/
├── go.mod
├── main.go
└── custom/
    └── custom.go

5. 替代方案:使用完整模块路径

如果你使用go mod init github.com/yourname/project

package main

import (
    "fmt"
    "log"
    "github.com/yourname/project/custom"
)

func main() {
    log.Println("gotest")
    fmt.Println("text", custom.Varone)
}

6. 运行命令

确保在项目根目录运行:

go run main.go

或者:

go run .

关键点:

  1. Go 1.11+ 使用模块系统,不再依赖GOPATH
  2. 导出标识符必须大写开头
  3. 确保在正确的目录结构中工作
  4. VS Code Go扩展需要有效的go.mod文件才能正确解析导入
回到顶部