Golang中无法导入函数的问题如何解决

Golang中无法导入函数的问题如何解决 Screenshot 2023-06-15 at 9.39.34 AM

你好, 我在导入函数时遇到了问题。我的目录结构如上图所示。 我想将 handlerReadiness 函数从 handler_readiness.go 导入到 main.go 中。但是当我运行 main.go 文件时,它提示“未定义的 handlerReadiness”。 尽管当我将鼠标悬停在 handlerReadiness 上时,可以看到该函数已定义,并且可以通过 command+click 跳转到它的定义。

请帮助解决这个问题。


更多关于Golang中无法导入函数的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

查看 handler_readiness.go 文件。

更多关于Golang中无法导入函数的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


@falco467 是的,这个方法有效。非常感谢!

在同一个包内,这并不重要。

falco467:

我认为你需要使用:go run .

好眼力。

这不是同一个包。如果是的话,那确实应该改变。

我使用跨多个文件的主包时遇到的只有麻烦。

小写名称表示“私有”,大写名称表示“公有”,因此你需要将函数重命名为以大写字母开头的名称。

你还希望为此使用另一个包,然后可以从你的主程序中导入它。

我认为你需要使用:go run . 而不是 go run main.go,后者只会编译单个文件,而不是目录中的所有 Go 文件。

Go 开发人员甚至建议在开发时应该使用 go build && go-project.exe 来运行你的代码,而不是使用 go run

handler_readiness.go 文件与 main.go 位于同一目录下,因此它也必须属于 main 包。你不需要从同一包的另一个文件中导入函数。它们对该包的所有其他文件都是可用的。

如果你想将 handler_readiness.go 作为一个单独的包,请将其移动到子目录中,并确保函数是导出的(正如 @NobbZ 所描述的那样)。

在Go中,函数首字母必须大写才能被其他包导入使用。你的handlerReadiness函数是小写开头,这表示它是包内私有函数,无法从其他包访问。

解决方案:

将函数名改为大写开头:

// handler_readiness.go
package handler

// 改为大写H
func HandlerReadiness(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    w.WriteHeader(http.StatusOK)
    w.Write([]byte(http.StatusText(http.StatusOK)))
}

然后在main.go中导入并使用:

// main.go
package main

import (
    "net/http"
    "your-module-path/handler" // 替换为你的实际模块路径
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/ready", handler.HandlerReadiness)
    
    http.ListenAndServe(":8080", mux)
}

关键点:

  1. Go使用大小写控制可见性:大写开头=公开,小写开头=私有
  2. 确保你的go.mod文件正确设置了模块路径
  3. 导入路径应该基于模块路径+相对路径

如果问题仍然存在,检查:

  • go.mod文件是否存在且正确
  • 导入路径是否正确
  • 两个文件是否在正确的包中(handler包和main包)
回到顶部