Golang中如何在不同文件中调用handler到main函数

Golang中如何在不同文件中调用handler到main函数 main.go

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", ccc)

	http.ListenAndServe(":80", nil)
}

我希望将以下代码放在 folder/xx.go 中,并从 main.go 中移除

func ccc(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
}

感谢各位专家


更多关于Golang中如何在不同文件中调用handler到main函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

谢谢。你尝试过和我一样的方法吗?你成功编译了吗?

更多关于Golang中如何在不同文件中调用handler到main函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


抱歉,我还没完全理解它的用法。对不起,我是Go语言的新手。

xx.go 应该和 main.go 属于同一个包吗?您有什么特别的原因要把它放在子文件夹里吗?

感谢您的回复……xx.go 文件将包含所有可见函数,而主文件是路由器。有没有可能实现这样的结构?第二点是为了更好地组织 Go 文件。

老兄太感谢了…我搞定了…谢谢谢谢…

我也把代码放在不同的目录里了…不过我遵循了你的建议,需要添加注释并且函数名首字母要大写

一个包中的所有文件都位于单个目录中。不能使用这样的结构:

+ main.go
+ folder
   + xx.go

请按如下方式组织文件:

+ main.go
+ xx.go

使所有文件都成为 main 包的一部分:

package main

参见 https://talks.golang.org/2014/organizeio.slide#5

谢谢,我是在同一个目录下这样做的吗?

package main

import (
    "fmt"
    "net/http"
    "xy"
)

func main() {
    http.HandleFunc("/",xy.ccc)

    http.ListenAndServe(":80", nil)
}

package xy

import (
    "fmt"
    "net/http"
)
func ccc(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Test")
}

显示无法加载包

如果你是Go语言新手,应该先学习Go语言之旅:https://tour.golang.org/welcome/1

完成教程后阅读以下内容:

如果你想从 xy 包中导入函数并在主应用程序(package main)中使用,该函数必须被导出。要导出函数,请将其首字母大写:

package xy

// ...

func Ccc((w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, “Test”)
}

然后你可以在主包中使用导入的函数:

package main

// ...

func main() {
  http.HandleFunc("/",xy.Ccc)

  http.ListenAndServe(":80", nil)
}

请查看教程:https://tour.golang.org/basics/3

另请参阅:https://www.ardanlabs.com/blog/2014/03/exportedunexported-identifiers-in-go.html

在Go语言中,可以通过创建单独的包来组织handler函数,并在main.go中导入和使用它们。以下是具体实现步骤:

  1. folder目录下创建xx.go文件,定义一个包(例如handlers),并将handler函数放入该包中。
  2. main.go中导入这个包,并通过包名调用handler函数。

目录结构:

project/
├── main.go
└── folder/
    └── xx.go

folder/xx.go:

package handlers

import (
    "fmt"
    "net/http"
)

func Ccc(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
}

main.go:

package main

import (
    "net/http"
    "project/folder"  // 替换为你的模块名和路径
)

func main() {
    http.HandleFunc("/", handlers.Ccc)
    http.ListenAndServe(":80", nil)
}

关键点说明:

  • xx.go中,函数Ccc首字母大写,使其可从包外访问(导出)。
  • main.go中,导入路径"project/folder"需替换为你的实际模块名(在go.mod中定义)和文件夹路径。
  • 调用时使用handlers.Ccc,其中handlers是包名(在xx.gopackage语句中定义)。

如果模块名为example.com/project,则导入语句应为:

import "example.com/project/folder"

这样即可将handler函数分离到不同文件中,保持代码结构清晰。

回到顶部