Go 调用其他文件中的函数

Go 调用其他文件中的函数,go,Go,我不知道如何在另一个文件中使用函数 我的项目架构: . ├── main.go └── src └── function.go 1 directory, 2 files 梅因,加油 package main import "src/funcrion" func main() { funcrion.Display(); } 函数 package src import "fmt"; func Display() { fmt

我不知道如何在另一个文件中使用函数

我的项目架构:

.
├── main.go
└── src
    └── function.go

1 directory, 2 files
梅因,加油

package main

import "src/funcrion"

func main() {
    funcrion.Display();
}
函数

package src

import "fmt";

func Display() {
    fmt.Println("Hello World");
}
在开始我的项目时,我使用:

go run main.go
错误:

main.go:3:8: cannot find package "src/funcrion" in any of:
    /usr/local/opt/go/libexec/src/src/funcrion (from $GOROOT)
    /Users/clementbolin/go/src/src/funcrion (from $GOPATH)
首先,我想解决这个问题。第二次,我想知道编译一个包含10个以上文件的真实项目的最佳选项是什么,例如,我需要使用Makefile吗?或者类似于Rust go has package manager?

当您在go上导入src/funcrion时,go编译器将尝试在GOPATH和GOROOT中搜索它,正如您在错误消息中看到的那样。它不会尝试在当前文件夹中搜索。因为它在GOPATH或GOROOT中都找不到具有该名称的包,所以它会给出该错误

引用当前文件夹的一个好方法是使用go模块。在项目的根目录上执行$go mod init myproject。替换myproject以获得更适合您的项目的名称

完成此操作后,可以使用myproject在包名称中引用项目文件夹,如:

package main

import "myprject/src"

func main() {
    src.Display();
}
还要注意的是,导入只指向包名,而不是文件名。因此,在您的情况下,不应该仅仅因为src包中有一个function.go文件就导入myproject/src/function

由于Display函数位于src包内,因此在导入包后,只需使用src.Display引用它。无需在任何位置指定文件名

您可以在此处阅读有关go模块的更多信息:


另一个技巧是不要使用src作为包名。在Go中,通常没有src文件夹,作为包名也不是很好。例如,请参阅读取src.Display的行。本能地,我会把这看作是源代码的显示,没有任何意义。但是,如果您将包名命名为src,则同一行将读取text.Display,该行将读取为Display some text,这对于函数正在执行的操作更为准确和有意义。

我相信包名是src,但我看到您正在尝试导入src\funcrion。没有名为funcrion的包

我想你应该做点像这样的事情。走吧

package main

import "src"

func main() {
    src.Display();
}
或者,如果您想将您的src包称为funcrion,那么只需像下面那样导入它

导入函数src

并确保您的文件结构如下所示,位于$GOPATH内

Users
└── clementbolin
    └── go
        └── src
            ├── main.go
            └── src
                └── function.go

请阅读。无法导入文件,只能导入包。hm以及如何导入包?你每次都要改变路径吗@icza发布的链接中描述了mkoprivaIt。请关注每篇文章中的一个问题。如何修复导入与是否应该使用Makefile完全无关。好吧,但我的目标是创建一个不在$GOPATH中的项目