Golang中'go run .'是什么意思?:)

Golang中’go run .'是什么意思?:) 你好, go run main.gogo run . 有什么区别? 当我使用 go run . 时,我运行的是什么?😃(抱歉英语不好) (也许这张图片可以帮助你理解)

image

谢谢 🙂

3 回复

你好,@raifpy

当你运行 go run . 时,go 程序会在当前目录(“.” 就代表当前目录)中寻找一个包含 main 包的包,并且在该包的某个文件中找到 main 函数。

当你运行 go run main.go 时,go 程序不会去检查目录中哪个文件包含 main 函数,而是直接在 main.go 文件中寻找该函数并执行它,其效果与 go run . 相同。据我所知,唯一的区别在于,如果你更改了文件名(例如,从 main.go 改为 mypackage.go 或其他名字),那么 go run main.go 显然会停止工作,而 go run . 则会继续正常工作。

func main() {
    fmt.Println("hello world")
}

更多关于Golang中'go run .'是什么意思?:)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你尝试过阅读手册(go 命令 - cmd/go - Go 包)吗?

编译和运行 Go 程序

用法:

go run [构建标志] [-exec xprog] 包 [参数…]

Run 编译并运行指定的主 Go 包。通常,该包被指定为来自单个目录的 .go 源文件列表,但它也可以是导入路径、文件系统路径或匹配单个已知包的模式,例如 go run .go run my/cmd

默认情况下,go run 直接运行编译后的二进制文件:a.out 参数…。如果给出了 -exec 标志,go run 会使用 xprog 调用二进制文件:

xprog a.out 参数…

如果未给出 -exec 标志,并且 GOOS 或 GOARCH 与系统默认值不同,并且能在当前搜索路径中找到名为 go_$GOOS_$GOARCH_exec 的程序,那么 go run 会使用该程序调用二进制文件,例如 go_js_wasm_exec a.out 参数…。这允许在模拟器或其他执行方法可用时执行交叉编译的程序。

Run 的退出状态并非编译后二进制文件的退出状态。

go run . 表示运行当前目录下的主包(main package)。它会自动查找当前目录中所有 .go 文件,编译并执行其中的 main 函数。

区别:

  • go run main.go:仅编译并运行指定的单个文件(main.go)。如果 main.go 依赖同目录下的其他文件,这些文件也会被自动包含。
  • go run .:编译并运行当前目录下的所有 .go 文件,但要求其中必须包含一个 main 函数作为入口点。

示例: 假设目录结构如下:

project/
├── main.go
├── utils.go
└── config.go

main.go 内容:

package main

import "fmt"

func main() {
    fmt.Println("Starting...")
    result := Calculate(5, 3)
    fmt.Println("Result:", result)
}

utils.go 内容:

package main

func Calculate(a, b int) int {
    return a + b
}

运行方式:

  1. go run main.go:Go 会自动找到依赖的 utils.go 并一起编译运行。
  2. go run .:效果相同,编译当前目录所有文件并运行。

特殊情况: 如果目录下没有 main 函数,go run . 会报错:

go run: no go files in .

注意: go run . 不会递归处理子目录。如果需要运行子目录中的主包,可以指定路径:

go run ./cmd/myapp

两种方式都会在临时目录编译并立即执行,不会生成可执行文件。

回到顶部