【问题标题】:Use functions of other files is other directories Golang [closed]使用其他文件的功能是其他目录Golang [关闭]
【发布时间】:2020-09-02 15:20:43
【问题描述】:

我想在我的 main 方法中使用一个名为“controllers”的文件夹中的方法,但事实证明,当我启动程序时,它说该函数未找到或未定义,我尝试按照包指南进行操作在 Golang 文档中,但使用 Go build 和 Go install 这不起作用,我只想知道如何使用其他文件夹中的文件来获得更多订单,这里是代码和我的文件树,首先: UserController.go,这里是 funcionLoadRecordsFromFile()...(重复...我尝试使用 go build 并从文档中安装,但不起作用...)

package main
import (
    "net/http"
    "log"
)
func LoadRecordsFromFile(w http.ResponseWriter, r *http.Request) {
    // Maximum upload of 10 MB files
    r.ParseMultipartForm(10 << 20)
}

这是我的 main.Go,如果我想使用来自 UserController.go 的函数 LoadRecordsFromFile()

package main
import (
    "net/http"
    "github.com/go-chi/chi"
    "log"
)
func main() {
    r := chi.NewRouter()
    r.Post("/loadUsers", func(w http.ResponseWriter, r *http.Request) {
        LoadRecordsFromFile(w,r)
    })

    log.Print("Server started in port 3000")
    http.ListenAndServe(":3000", r)
}

档案是……

-GolangProject
-Main.go
-controllers
    --UserController.go

【问题讨论】:

  • 你能添加实际的错误吗?
  • 您需要导入声明了您要引用的标识符的包。您还需要在引用该标识符时对其进行打包限定。
  • @GiovanniMosquera 您只能直接引用在同一包中声明的标识符,即同一文件夹(非递归,即子文件夹不计算在内)。除内置标识符外,任何其他标识符都必须使用包限定符引用,但要能够使用包限定标识符,您首先需要导入您尝试使用的包。就像您导入 chi 并使用 chi.NewRouter 引用 NewRouter 一样,您需要导入控制器包并通过使用包名称对其进行限定来引用函数。
  • 请阅读官方文档中的How to write go code
  • “我已经读过了,但我不是很明白” 那你应该再读一遍,一直读到明白为止。 @GiovanniMosquera

标签: go model-view-controller


【解决方案1】:

您需要对代码进行一些更改。

  1. 首先,您需要在UserController.go 中更改您的包名称。让我们使用controllers 作为包。

    package controllers
    
    import (
        "net/http"
        "log"
    )
    func LoadRecordsFromFile(w http.ResponseWriter, r *http.Request) {
        // Maximum upload of 10 MB files
        r.ParseMultipartForm(10 << 20)
    }
    
  2. 那么您的Main.go 需要进行一些更改。

    package main
    
    import (
        "net/http"
        "github.com/go-chi/chi"
        "log"
    
        "github.com/Giovanni2414/Truora/controllers"
    )
    
    func main() {
        r := chi.NewRouter()
        r.Post("/loadUsers", func(w http.ResponseWriter, r *http.Request) {
            controllers.LoadRecordsFromFile(w,r)
        })
    
        log.Print("Server started in port 3000")
        http.ListenAndServe(":3000", r)
    }
    

我认为这些变化已经足够了。


一些注意事项:

  • 只有你的主文件应该有package main
  • 通常我们在 current folder 之后定义包名称(但可以不同)。同一文件夹下的所有文件必须具有相同的package 名称。
  • 当您使用不同包下的函数时,应先导入所需的包,然后才能使用该函数。
    您导入的路径应如下所示:&lt;project-module-name&gt;/&lt;folder1&gt;/&lt;folder2&gt;/../&lt;final-folder&gt;
  • 最后,您应该像下面这样调用该函数:
    package_name.MyFunction()
    

【讨论】:

  • 现在我的代码可以正常工作了!我真的非常感谢你,也非常感谢你没有像其他几个人一样告诉我“阅读如何阅读代码”:)
  • @GiovanniMosquera,我在回答中添加了一些注释。你应该检查一下。
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多