Golang中如何编译多个go文件

Golang中如何编译多个go文件 我非常喜欢Go语言的设计。尽管它缺少面向对象编程的特性,但它非常易于学习和使用。因此,我尝试编写了一些Go代码,并且希望进一步学习这门语言。但是,在我的测试项目中使用了两个Go文件时,我在编译过程中遇到了障碍。

我在E:\Go Projects\Samples\Sample1文件夹中创建了一个testFile.go文件。我在该文件中编写了一个名为sayHello的函数。在文件的开头,我写了package testFile

然后,我在同一目录下创建了一个caller.go文件。在这个文件的第一行,我写了package main。在导入部分,在"fmt"下面,我写了"testFile"。接着,在main函数中,我调用了来自testFile.gosayHello函数。但是,当我编译这个caller.go文件时,它给出了以下错误信息:

cannot find package “testFile” in any of:
c:\go\src\testFile(from $GOROOT)
C:\Users\UserName\go\src\testFile(from $GOPATH)

看起来Go没有在主文件的源代码目录中检测到该文件。如何解决这个问题?请帮助我。提前感谢。

注意:我是在VS Code中编译这个caller.go文件的(使用了VS Code中的运行按钮)。


更多关于Golang中如何编译多个go文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

21 回复

我不明白你的意思?这是讽刺吗?

更多关于Golang中如何编译多个go文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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

感谢详细的回复。我认为最好选择最后一个选项“Go Modules”。

所以你的意思是,每次我打算在Go中创建一个新项目时,我都可以用这个bat文件来更改go路径吗?那么让我问你一件事:有没有IDE能为我做这件事?

感谢您的回复。但您回复中的部分内容我并不了解。有一点非常明确,我需要学习 Go 模块。我对 D 语言中的模块有一些初步了解。希望我能轻松学会它。

如果能写成 “for x in collection” 这样,并且 x 代表集合中的每个元素,那就非常简单了。

嗯,你所要求的实际语法是:

for index, x := range collection { ... }

谢谢。我来检查一下。 顺便问一个题外话——在Go语言中有没有办法改变for循环的语法?当我们想要遍历一个集合时,如果能写成“for x in collection”这样的形式,并且x代表集合中的每个元素,那就非常方便了。

基本上,我不想把我的项目文件放在C盘。C盘用于安装所有程序和编译器,包括Go。我希望将所有项目文件保存在Dropbox文件夹中,这样我就可以在工作时在电脑上学习,在家时在笔记本电脑上学习。 所以请告诉我如何解决Go的路径问题。

很抱歉这么说,但我真的不知道 Go 中的模块是什么。在 vb.net 中,模块是一个静态类。你可以在模块中编写代码,并且不用担心导入的事情,因为集成开发环境会为你处理。

// 代码示例(如有需要可在此处添加)

vinod_kc:

在几乎所有示例中,人们似乎都使用 github.com 作为路径

这是包的路径,或者至少是它的一部分。

vinod_kc:

作为一名 Windows 用户

嗯,你的操作系统并不重要,包的路径并不直接映射到你的文件系统路径,而是映射到一个公共前缀,即所谓的 GOPATH。如果你使用模块,则会以其他方式为你管理。

作为Windows用户,我们不喜欢命令行相关的东西。我们更愿意点击一个运行按钮,然后坐下来欣赏魔法。但自2017年以来,好奇心驱使我去探索一些.NET家族之外的新编程语言。这就是我如何进入命令行世界的。通常,如果我们在Windows上喜欢某个编程语言,它的网站上会有EXE文件。如果你下载并运行它,它会自动完成环境变量设置。我们不需要了解任何东西。但对于像Go这样的语言,情况并非如此。

你好, 感谢你的回复。 嗯,我的文件夹结构有所不同。 Go 环境变量如下: GOENV=C:\Users\UserName\AppData\Roaming\go\env GOPATH=C:\Users\UserName\go GOROOT=c:\go

但是我的项目目录是另一个。 E:\Programming Folder\Go Projects\Samples\Sample1\sampleCode1.go 你看,名为 Sample1 的文件夹包含了 Go 代码文件。所以我期望 Go 能从这个源代码目录找到包文件。但它做不到这一点。

信不信由你,我刚刚完成了一个程序来帮助解决这个问题。

我主要是为Windows及其同类系统制作的,但它应该能正常工作(如果有问题,请告诉我)。

我在便携式设置中使用它,将msys2.orgGit Bash软件安装在我的闪存驱动器上。请查看github/Merith-TK/Personal-Projects中的launcher.go文件。

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

但是我的项目目录不同。 E:\Programming Folder\Go Projects\Samples\Sample1\sampleCode1.go 你看,名为 Sample1 的文件夹包含了 Go 代码文件。

如果你使用 Go 模块(Go 1.11 引入并在 1.12 中略有重写的功能),这完全没有问题。

你需要在你项目的根目录下有一个 go.mod 文件才能使其正常工作。如果你不想或者不能使用 Go 模块,你需要将你的项目放在 $GOPATH/src 目录下,因为这是 Go 的工作方式。

你好, 感谢回复。

我有一些使用FreeBasic和Nim的经验。去年,我用这两种语言创建了一个GUI库。所有的导入语句都写在一个文件中,我们可以称该文件为“GuiLib”。库用户只需导入“GuiLib”即可。他们可以轻松地使用GUI类和方法。在Go中我该如何实现这一点?如果我将这个库写成一个包(假设称为“GuiPack”),那么当我将这些文件放在与我的main.go相同的目录中时,Go是否能检测到这个包?

正如我所说,使用 Go 模块。或者将你的 GOPATH 更改为指向你喜欢的任何位置。

GitHub

GitHub - golang/go

头像

golang/go

Go 编程语言。通过在 GitHub 上创建帐户来为 golang/go 的开发做出贡献。

你好, 感谢您的回复。 在几乎所有示例中,人们似乎都使用 github.com 作为路径。作为一名 Windows 用户,我使用的是像 C:\FolderName\SubFolderName\FileName.Ext 这样的路径,C 可以被替换为 D、E、F。这是 Windows 中的常规路径。但我在 Go 中看不到任何类似的示例。 请告诉我,当我打算用 Go 制作一个 GUI 库时,应该如何放置文件。 假设每个控件都需要一个单独的文件。例如,一个文件用于按钮控件,一个文件用于文本框控件等。 并且有一个单独的文件导入和导出所有这些文件。假设它被命名为 GuiLib.go。 所以我认为,当我需要制作一个 Windows GUI 程序时,我可以轻松地导入这个 GuiLib.go,一切都会正常。是这样吗?

我实际上在我的程序中实现了这个功能。

	str, err := ioutil.ReadFile("settings.json")
	if err != nil {
		fmt.Print(err)
	}

	err = json.Unmarshal([]byte(str), &settings)

	fmt.Println("APP:", settings.Application)
	fmt.Println("ARG:", settings.ApplicationArgs)
	for k, v := range settings.Environment {
		os.Setenv(k, v)
		fmt.Println("ENV:", k, "=", v)
	}

	args := make([]string, 0)
	if len(settings.ApplicationArgs) > 0 {
		args = append(args, settings.ApplicationArgs)
	}
	cmd := exec.Command(settings.Application, args...)

k 是循环中的第一个变量,在这个例子中,代表环境变量名。 v 是循环中的第二个变量,在这个例子中,代表你想要设置的环境变量值。

为了让你的导航操作更轻松,我强烈推荐使用像 Cygwin 或 MSYS 这样的工具。

大家好, 我想我自己找到了答案。

  1. 在所有代码文件中使用 “package” main。(我在这里用了文件名。)所以每个 Go 文件的第一行都应该是 “package main”。
  2. 不需要在你的主文件中导入其他文件。(我之前写了一个 import 语句。)
  3. 要运行你的文件,只需输入 “go run .”。看到了吗?最后部分是一个点。别漏了它。
  4. 要构建你的代码生成 exe 文件 - “go build .”。这里也有一个点。但不幸的是,我没看到任何选项可以指定 exe 文件的名称。默认情况下,它与文件夹名称相同。所以我得到的是 src.exe 而不是 caller.exe。没关系,我们之后可以重命名它。 但主要问题是,我无法用 VS Code 的运行按钮来运行这个 Go 文件。因为它预设为运行 “go run $filName”。 无论如何,我很高兴可以继续用 Go 编码了。否则,我原本打算放弃 Go 了。

vinod_kc:

很抱歉这么说,但我真的不知道 Go 中的模块是什么。

Go 中的“模块”是位于一个共同“命名空间”下的包集合。很遗憾,我无法在 VB.NET 领域给你任何对等物,因为我不熟悉 .NET 生态系统。

不过,我给过你模块官方文档的链接。

基本上,我会说,Go 模块就是其他语言中所谓的项目。

vinod_kc:

有没有什么 IDE 可以为我[更改 GOPATH]?

我知道 Visual Studio Code 可以通过 .vscode/settings.json 文件(或类似名称的文件)将 GOPATH 作为项目设置来处理。不过,这只会影响 IDE 和已加载工具的包搜索路径,而且你还需要为“工具 GOPATH”添加一个全局设置,以便它们只在一个单独的区域安装一次。如果你漏掉了这一步,插件会在每个项目的本地 GOPATH 中安装工具。

此外,如果你想使用 shell,仍然需要自己为 shell 会话设置 GOPATH。

不过,我建议不要折腾 GOPATH,要么按照其设计初衷使用它,并为所有项目使用一个单一的 GOPATH;要么使用 Go 模块,这是在 Go 中进行项目开发的新颖且出色的方法。

在Go中编译多个文件时,需要确保包声明和导入路径正确。根据你的描述,问题在于testFile包被声明为本地包,但Go的模块系统没有正确识别。以下是解决方案:

1. 初始化Go模块(推荐方法) 在项目根目录执行:

cd "E:\Go Projects\Samples\Sample1"
go mod init sample1

这会在目录中创建go.mod文件,定义模块路径为sample1

2. 修改包声明和导入

  • testFile.go应使用package testFile(保持不变)
  • caller.go的导入应改为模块路径+包名:
package main

import (
    "fmt"
    "sample1/testFile"  // 使用模块路径
)

func main() {
    testFile.SayHello()  // 注意:Go中导出函数需要大写开头
}

3. 编译整个包 在项目目录执行:

go build

或编译特定文件:

go build caller.go testFile.go

4. 如果使用旧版GOPATH模式 将项目放在GOPATH下的src目录中:

C:\Users\UserName\go\src\Samples\Sample1\

然后导入改为:

import "Samples/Sample1/testFile"

关键点:

  • Go 1.11+推荐使用模块系统(go mod)
  • 导出函数/变量必须以大写字母开头
  • 同一目录下的文件必须属于同一个包(除了main包)
  • 使用go build编译时,会自动处理同一目录下的所有.go文件

示例testFile.go

package testFile

import "fmt"

func SayHello() {  // 大写S才能被导出
    fmt.Println("Hello from testFile")
}

在VS Code中,确保打开的是项目根目录(包含go.mod的目录),然后使用终端执行go run caller.go或配置VS Code的launch.json指向正确的工作目录。

回到顶部