File 为什么我的Go程序会使用打开的文件名创建另一个Go进程,以及为什么它';那么大?

File 为什么我的Go程序会使用打开的文件名创建另一个Go进程,以及为什么它';那么大?,file,go,process,executable,ram,File,Go,Process,Executable,Ram,我有一个大约2mb的大.json文件。我用它来阅读json,只做了一点修改: func main() { pages := getPages() for { } for _, p := range pages { fmt.Println(p.toString()) } 如您所见,我设置了一个无限循环,以便在读取进程的RAM大小时让程序等待。当我去阅读时,我发现有两个围棋程序正在运行。我就这么做了 go运行myfile.go 但是我得到了两

我有一个大约2mb的大.json文件。我用它来阅读json,只做了一点修改:

func main() {
    pages := getPages()
    for {

    }
    for _, p := range pages {
       fmt.Println(p.toString())
    }
如您所见,我设置了一个无限循环,以便在读取进程的RAM大小时让程序等待。当我去阅读时,我发现有两个围棋程序正在运行。我就这么做了

go运行myfile.go


但是我得到了两个二进制文件:一个名为
go
,另一个名为文件名,没有json部分。
go
二进制文件大约有5mb,但这一个有36mb

为什么go用文件名创建另一个进程?它是不是放文件的地方,这样我就可以读了?为什么会这样?据我所知,文件读取应该由操作系统来完成。和.json大小相比,它为什么这么大

另外,当
getPages()
返回时,不应该因为go的垃圾收集器而从内存中删除文件对象和json对象吗

为什么go用文件名创建另一个进程

没有。是的。当您执行
go run main.go
时,您正在运行编译main.go的go程序,转到另一个可执行文件(您记得go是生成本机可执行文件的编译语言吗?),并执行第二个可执行文件。您告诉go工具这样做,它的行为符合您的要求。如果您不喜欢:
go build-o which/不管怎样

另外,当getPages()返回时,是否应该因为go的垃圾收集器而将文件对象和json对象从内存中删除

是的,这确实发生了。它只是无法以你试图检查它的方式被观察到。Go中的内存管理很复杂,与操作系统内存管理的相互作用也很复杂(并且依赖于操作系统),操作系统内存管理也很复杂

非常粗略:未引用的对象由Go GC收集,但内存不会“返回”到操作系统,因为“返回”和“重新获取”操作系统中的内存是一项非常昂贵的操作,因此内存不会“返回”到操作系统(除非需要)


如果你觉得内存管理的血淋淋的细节让你感兴趣的话,可以在网上搜索“go不会释放内存”

无睡眠或无睡眠的无限循环是个坏主意,它会消耗大量CPU。URL指向的文件是否就是您正在使用的确切代码?除非您回复注释,否则很难为您提供帮助。但是我得到了两个二进制文件:一个名为go,另一个名为文件名,但不包含json部分。go二进制文件有5mb,但这一个有36mb<代码>运行不会在工作目录中创建二进制文件