Go语言 如何“去运行”主包中包含多个文件的项目?

xbp102n0  于 2023-03-06  发布在  Go
关注(0)|答案(9)|浏览(98)

我在main包中有一个名为main.go的文件,因为代码不可重用,所以我想将代码的一部分放在同一个包中的另一个文件中。
如何将main.go的内容拆分为多个文件而不创建单独的包?
我想要这样的目录结构:

ls foo

# output:
main.go
bar.go
  • 文件:bar.go
package main

import "fmt"

func Bar() {
  fmt.Println("Bar")
}
  • 文件:main.go
package main

func main() {
  Bar()
}

当我运行go run main.go时,它给出:

# command-line-arguments
./main.go:4:2: undefined: Bar
erhoui1w

erhoui1w1#

更新日期:2019年7月26日(适用于go〉=1.11)

go run .

将工作在windows以及。

原始答案(适用于非Windows环境)

这段代码实际上是可以工作的,问题是我不应该运行go run main.go,而应该运行:

go run *.go
vcudknz3

vcudknz32#

2018年8月更新,使用Go 1.11,“运行”章节指出:
go run命令现在允许单个导入路径、目录名或与单个包匹配的模式。
这允许go run pkggo run dir,最重要的是go run .
原始答复2015年1月
正如在“How to compile Go program consisting of multiple files?“中提到的,go run需要一个文件列表,因为它“编译并运行包含指定Go语言源文件的main包”。
因此,您当然可以使用go runmain包拆分为多个文件。
这与go build/go install不同,go build/go install需要包名(而不是go文件名)。
一个简单的go build将生成一个以父文件夹命名的可执行文件。
请注意,作为illustrated by this threadgo run *.go不能在Windows CMD会话中工作,因为shell doesn't do wildcard expansion

qfe3c7zg

qfe3c7zg3#

在我看来,这个问题的最佳答案隐藏在对顶部答案的评论中。
运行以下命令:

go run .

这将运行主包中的所有文件,但不会给予如下错误消息

go run: cannot run *_test.go files (main_test.go)

感谢@BarthesSimpson

gev0vcfq

gev0vcfq4#

如前所述,您可以输入go run *.go,但对于Windows,您可以只列出脚本文件(因为 *.go不起作用)-go run main.go other.go third.go

brqmpdu1

brqmpdu15#

执行此操作的第一个方法是运行

go run *.go

另一种方法是生成exe文件

go build

然后运行该.exe文件

./filename.exe
enxuqcxy

enxuqcxy6#

多种选择

  1. go run .
  2. go run *.go
  3. make run使用Makefile,其中,添加上述任意命令作为构建目标。
    用于测试
  4. go test ./...
  5. make test使用Makefilego test ./...作为构建目标
pod7payv

pod7payv7#

对于Windows安装Cygwin并使用它而不是命令提示符。“go run *.go”将工作。

js5cn81o

js5cn81o8#

如果你想在本地主机上用gorilla mux运行多个文件,请尝试使用以下两个命令中的任意一个。
1.安装&&文件夹名称-端口8081。
1.转到build && ./文件夹名称-端口8081。
在终端中执行命令之前,请确保您位于源文件夹中,即go/src/FolderName。

cfh9epnr

cfh9epnr9#

对于今天的Golang,go run .本身是不够的。
首先,您需要使用一次性设置初始化文件夹:

go mod init noname

现在,您可以使用以下命令运行程序:

go run .

虽然它没有解释为与go mod init一起使用而选择的名称的意义,但下面演示了此方法:一个关键点是,对于最普通的情况(如典型的go run .),“为您的代码启用依赖关系跟踪”是可选的,但对于任何非普通的应用程序或工作流(例如使用非标准导入),这是必需的。
上面例子中使用的noname可以用任何类似于相对路径名的东西来代替,如果你构建的是一个主模块,而且你不打算把它导入到其他地方,那么你用什么作为模块名基本上没有关系。
之前在此要求对go mod init进行基本解释:Can someone please dumb down go mod init for me?
注意:如果没有go mod init (somename)go run .将返回如下错误...

$ go run .
go: go.mod file not found in current directory or any parent directory; see 'go help modules'

可能存在替代解决方案:Error message "go: go.mod file not found in current directory or any parent directory; see 'go help modules'"

相关问题