Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go多文件调用与main函数踩坑

Go多文件调用与main函数踩坑及解决

作者:XMYX-0

本文介绍了在学习Go语言时常见的几个错误及其解决方法,包括多文件、main函数、包作用域以及gorun的使用方式,通过详细的分析和示例,帮助读者更好地理解和解决这些问题

在学习 Go 的过程中,经常会遇到以下报错:

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

这些问题大多和 多文件、main 函数、包作用域 以及 go run 的使用方式 有关。本文带你一步步理解并解决。

问题场景

假设我们有两个文件都在同一个目录下

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")
}

如果执行:

go run 1.go

报错:

undefined: a1

原因:Go 只编译你指定的文件,而 a1()2.go 中,所以找不到。

常见报错解析

undefined: a1

原因:函数或变量在当前编译范围内不存在

解决方法:

main redeclared in this block

原因:同一个 package 下存在多个 main() 函数

解决方法:

function main is undeclared in the main package

go: go.mod file not found in current directory or any parent directory

go mod init demo1

初始化模块后,目录下会生成 go.mod 文件,就可以使用 go run . 编译整个目录。

Go 多文件调用正确姿势

明确指定多个文件编译

go run 1.go 2.go

初始化 Go module,再用目录编译

go mod init demo1   # 初始化模块
go run .            # 编译整个目录

示例目录结构

go-demo/
  main.go      # 包含 main()
  funcs.go     # 包含其他函数
  go.mod       # go module 文件

main.go

package main

func main() {
    a1()
}

funcs.go

package main

import "fmt"

func a1() {
    fmt.Println("Hello from a1")
}

运行:

go run .

输出:

Hello from a1

截图是根据最上边我的1.go and **2.go**继续走的

✅ 完美解决了 undefined 和 main 函数冲突问题,也支持模块化管理。

总结

常见坑点

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文