Golang中无法将包变量导入到主包的问题
Golang中无法将包变量导入到主包的问题
我正在尝试从“custom”包中获取值,该包位于 %GOPATH%/src/custom/custom.go,并在 main.go 文件中打印这些值。我已在 VS Code 中安装了 Go 扩展。由于包未正确导入,扩展会移除导入语句。
我不明白为什么这不起作用。我检查了 %GOPATH%,它看起来是这样的:F:\Super\Super\Workspace。
我的 src 文件夹结构如下:

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
变量名应以大写字母开头,以便能够被导出。
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 中

非常感谢。抱歉回复晚了。根据您的建议,我选择了使用 Go 模块。我之前甚至在官方的 Go 沙箱中见过并尝试过 Go 模块。但在当前的安装环境中,它在 VSCode 上无法正常工作。目前,我已在 Linux 中设置了一个虚拟机。Go 在 VSCode 中似乎运行得很好。
感谢两位的尝试帮助。但这仍然无法解决问题。也许将来我能自己找出这个问题的原因。我使用的是 go 版本 go1.15.3 windows/amd64。

just_started:
.\main.go:12:22: undefined: custom.Varone
您 custom 包内的 Varone 和 Vartwo 也必须重命名为大写。否则,它们将不被视为已导出供他人使用。
您遇到的错误是编译器正在从 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模块,这将不起作用,因为模块处理依赖的方式不同。
(编辑)本应在主题下回复,但点错了回复按钮。
好的,我在我的笔记本电脑上测试了你的源代码,运行正常,无论是在 GO111MODULE 设置为 auto 还是 off 模式下。所以你的代码本身没有问题。这归结为另外两种可能性:
- 你的整个工作区不在 GOPATH 内,并且你没有使用 Go 模块。
- 配置错误 / 编辑器故障。
终端测试输出
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 .
关键点:
- Go 1.11+ 使用模块系统,不再依赖
GOPATH - 导出标识符必须大写开头
- 确保在正确的目录结构中工作
- VS Code Go扩展需要有效的
go.mod文件才能正确解析导入


