Go多文件調(diào)用與main函數(shù)踩坑及解決
在學(xué)習(xí) Go 的過(guò)程中,經(jīng)常會(huì)遇到以下報(bào)錯(cuò):
undefined: a1
main redeclared in this block
function main is undeclared in the main package
go: go.mod file not found in current directory or any parent directory
這些問(wèn)題大多和 多文件、main 函數(shù)、包作用域 以及 go run 的使用方式 有關(guān)。本文帶你一步步理解并解決。
問(wèn)題場(chǎng)景
假設(shè)我們有兩個(gè)文件都在同一個(gè)目錄下:

1.go
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("6")
fmt.Fprintln(os.Stdout, "1")
println("4")
fmt.Fprintln(os.Stdout, "3")
a1()
}
2.go
package main
import "fmt"
func main2() {
fmt.Println("Hello from main2")
}
func a1() {
println("a2")
fmt.Println("a5")
}
如果執(zhí)行:
go run 1.go
報(bào)錯(cuò):
undefined: a1
原因:Go 只編譯你指定的文件,而 a1() 在 2.go 中,所以找不到。
常見(jiàn)報(bào)錯(cuò)解析
undefined: a1
原因:函數(shù)或變量在當(dāng)前編譯范圍內(nèi)不存在
解決方法:
- 函數(shù)名拼寫(xiě)要一致
- 函數(shù)在同一個(gè) package 下
- 編譯器能看到包含函數(shù)的文件(多文件一起編譯)
main redeclared in this block
原因:同一個(gè) package 下存在多個(gè) main() 函數(shù)
解決方法:
- 每個(gè)目錄只放一個(gè) main()
- 其他函數(shù)改名
- 多 demo 使用不同目錄
function main is undeclared in the main package
- 原因:package main 中沒(méi)有 main() 函數(shù)
- 解決方法:保證至少有一個(gè) main() 函數(shù)
go: go.mod file not found in current directory or any parent directory
- 原因:使用
go run .編譯整個(gè)目錄時(shí),Go modules 機(jī)制要求當(dāng)前目錄或父目錄必須有go.mod文件 - 解決方法:
go mod init demo1
初始化模塊后,目錄下會(huì)生成 go.mod 文件,就可以使用 go run . 編譯整個(gè)目錄。
Go 多文件調(diào)用正確姿勢(shì)
明確指定多個(gè)文件編譯
go run 1.go 2.go

初始化 Go module,再用目錄編譯
go mod init demo1 # 初始化模塊 go run . # 編譯整個(gè)目錄
示例目錄結(jié)構(gòu)
go-demo/ main.go # 包含 main() funcs.go # 包含其他函數(shù) go.mod # go module 文件
main.go
package main
func main() {
a1()
}
funcs.go
package main
import "fmt"
func a1() {
fmt.Println("Hello from a1")
}
運(yùn)行:
go run .
輸出:
Hello from a1
截圖是根據(jù)最上邊我的1.go and **2.go**繼續(xù)走的

? 完美解決了 undefined 和 main 函數(shù)沖突問(wèn)題,也支持模塊化管理。
總結(jié)
- Go 文件必須在同一個(gè) package 下 才能互相調(diào)用
- 一個(gè) package main 只能有一個(gè) main()
- 單文件運(yùn)行 → 指定文件名
go run file.go - 多文件或模塊化運(yùn)行 → 使用
go run .或go run file1.go file2.go - 模塊化管理 → 初始化 go module,目錄結(jié)構(gòu)清晰,適合大型項(xiàng)目
常見(jiàn)坑點(diǎn):
- 多文件調(diào)用未同時(shí)編譯 →
undefined - 同目錄多個(gè) main() →
main redeclared - 沒(méi)有 main() →
function main is undeclared - 使用
go run .未初始化模塊 →go.mod file not found
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Go語(yǔ)言基礎(chǔ)入門應(yīng)用簡(jiǎn)介及常用命令
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)入門應(yīng)用簡(jiǎn)介及常用命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)壓測(cè)工具
這篇文章主要為大家詳細(xì)介紹了基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的壓測(cè)工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
Golang內(nèi)存泄漏場(chǎng)景以及解決方案詳析
golang中內(nèi)存泄露的發(fā)現(xiàn)與排查一直是來(lái)是go開(kāi)發(fā)者頭疼的一件事,下面這篇文章主要給大家介紹了關(guān)于Golang內(nèi)存泄漏場(chǎng)景以及解決的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語(yǔ)法
這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語(yǔ)法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

