go - 无法使用导入包中的功能
问题描述
我当前的目录设置如下:
-- /webserver
|
/ftp
|-> ftp.go
|-> go.mod
|->server.go
|->go.mod
Server.go 页面标题
package main
import (
[..]
"../webserver/ftp" // issue package
)
func main() {
[..]
ftp.test()
}
ftp.go 页面
package ftp
import "fmt"
func test() {
fmt.Println("YES!")
}
这是控制台“问题”选项卡中我似乎无法理解的部分。ftp.go 文件被保存。在我使用“../webserver/ftp/”保存 server.go 文件之前,控制台会显示:
当我保存 server.go 时,它会删除“./webserver/ftp”,我将它添加到 go src 中以使其成为“ftp”而不是“../webserver/ftp”。我得到相同的结果。
不知道我做错了什么。
基本上我想要完成的是:
有一个函数文件夹并在该文件夹(functions.go)中有函数,以保持 server.go 页面尽可能干净。
解决方案
你在这里有几个问题。
ftp/go.mod
不应该存在。虽然可以在单个存储库中拥有多个 Go 模块,但这是非常高级的用法,并且很少有用。除非你完全知道自己需要这种能力,并且已经非常熟悉创建和发布 Go 模块,否则不要这样做。Go 不支持相对导入。
import "../webserver/ftp"
是无效的导入路径*。使用完全限定的导入路径,即import "github.com/username/projectname/webserver/ftp"
此处使用的路径取决于
module
您在顶级go.mod
文件行中声明的模块名称。您不能导入未导出的值。
您已
func test() string
在ftp.go
. 由于以小写字母开头,因此未导出。Go 中仅导出以大写字母开头的函数、变量或其他符号。试试func Test() string
吧。
*有些人会说“但我用过import ".../foo"
而且效果很好!”。是的,它可以在非常特殊的情况下工作。但是它的行为是不可靠的,所以你不应该依赖它,除非在非常特定的测试类型的情况下。
推荐阅读
- laravel - 如何使用 Laravel 从与密钥相关的数据库中获取数据?
- ios - Xcode 11.3 无法附加到 pid:
没有互联网 - wso2 - 在 WSO2 API Manager 中添加新订阅策略并在 API 上应用
- android - 无法为 Eclipse 和 Android 执行 Gluon“入门”示例
- java - 犯罪统计作业协助
- php - 不同供应商交易过程的SQL查询或算法
- haskell - 类型为 [Int] -> 属性的 QuickCheck 属性
- kubernetes - k8s 集群中主节点和 etcd 故障的影响
- python - 包含 html 格式数据的 csv 中的行读取问题
- express - 跳过和限制猫鼬模型子文档/数组