Golang中如何调用同包不同文件的函数

Golang中如何调用同包不同文件的函数 我有一个包含两个文件的 main 包:

  • main.go
  • api.go

main.go 文件的 main 函数 中,我使用了 findPetByID 函数

...
r.HandleFunc("/pet/{petId}", findPetByID).Methods("GET")
...

api.go 文件中我声明了 findPetByID 函数。 两个文件都在 main 包中声明,VSCode 没有显示任何问题,因为没有警告,IDE 能够从 main 函数中看到函数签名,即 findPetByID func(w http.ResponseWriter, r *http.Request)

但是当我启动它时,IDE 显示

# command-line-arguments
.\main.go:133:31: undefined: findPetByID 

这是什么问题?


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

2 回复

当您将 main 包拆分为多个文件时,在执行 go buildgo run 时需要手动指定所有文件。

我强烈建议不要将 main 包拆分到多个文件中,而是应该将这些内容合理地拆分成更小的包。

通常我不喜欢庞大的 main 包。

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


在Go语言中,同一个包内的不同文件之间可以直接调用函数,无需显式导入。出现"undefined: findPetByID"错误通常有以下几种可能原因:

1. 编译方式不正确

当使用go run main.go单独编译一个文件时,编译器不会自动包含同包的其他文件。

正确编译方式:

// 编译整个包的所有文件
go run .

// 或者明确指定所有文件
go run main.go api.go

// 或者构建整个包
go build

2. 包声明不一致

检查两个文件是否都有正确的包声明:

main.go:

package main

import (
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/pet/{petId}", findPetByID).Methods("GET")
    http.ListenAndServe(":8080", r)
}

api.go:

package main

import (
    "net/http"
    "github.com/gorilla/mux"
)

func findPetByID(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    petID := vars["petId"]
    w.Write([]byte("Finding pet with ID: " + petID))
}

3. 函数签名不匹配

确保函数签名完全一致:

// 正确的函数签名
func findPetByID(w http.ResponseWriter, r *http.Request) {
    // 函数实现
}

4. 文件位置问题

确保两个文件在同一个目录下,并且该目录不包含任何子包。

解决方案:

使用以下命令之一来运行程序:

# 方法1:运行当前目录所有go文件
go run .

# 方法2:明确指定所有文件
go run main.go api.go

# 方法3:先构建再运行
go build
./your-binary-name

如果问题仍然存在,请检查两个文件是否都在同一个目录中,并且包声明都是package main

回到顶部