首页 > 解决方案 > 无法使用导入包中的功能

问题描述

我当前的目录设置如下:

-- /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 之前保存

当我保存 server.go 时,它会删除“./webserver/ftp”,我将它添加到 go src 中以使其成为“ftp”而不是“../webserver/ftp”。我得到相同的结果。

保存后

不知道我做错了什么。

基本上我想要完成的是:

有一个函数文件夹并在该文件夹(functions.go)中有函数,以保持 server.go 页面尽可能干净。

标签: go

解决方案


你在这里有几个问题。

  1. ftp/go.mod不应该存在。虽然可以在单个存储库中拥有多个 Go 模块,但这是非常高级的用法,并且很少有用。除非你完全知道自己需要这种能力,并且已经非常熟悉创建和发布 Go 模块,否则不要这样做。

  2. Go 不支持相对导入。 import "../webserver/ftp"是无效的导入路径*。使用完全限定的导入路径,即import "github.com/username/projectname/webserver/ftp"

    此处使用的路径取决于module您在顶级go.mod文件行中声明的模块名称。

  3. 您不能导入未导出的值。

    您已func test() stringftp.go. 由于以小写字母开头,因此未导出。Go 中仅导出以大写字母开头的函数、变量或其他符号。试试func Test() string吧。

*有些人会说“但我用过import ".../foo"而且效果很好!”。是的,它可以在非常特殊的情况下工作。但是它的行为是不可靠的,所以你不应该依赖它,除非在非常特定的测试类型的情况下。


推荐阅读