是的,这是学习新的编程语言时的典型问题。我有这个:
$GOPATH/
src/
huru/
foo/
side.go
hello.go
在hello.go中,我有:
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/mux"
)
func main(){
Foo()
}
在foo / side.go中,我有:
package main
func Foo() {
}
我跑步:
go install huru
我得到:
# huru
src/huru/hello.go:22:2: undefined: Foo
编译器不喜欢Foo()
中的hello.go
调用,如何正确导入?我应该对两个文件都使用package main
吗?我假设不应该将软件包称为huru
,而不是huru
,为什么不将其称为main
? idk。
答案 0 :(得分:4)
如Go Documentation中所述,程序是由一个未导入的main
包定义的。一个程序中不能有多个main
软件包,因此,如果要创建一个库,例如您的foo
目录,您需要定义一个不同的包名称。
文档a description中还包含有关如何处理导入的信息。公平地说,这有点神秘,他们没有明确提到$GOPATH
,但是导入是相对于它的。但是,您不能导入相对于特定文件的软件包。
如果您执行以下操作,您的代码将可以正常编译:
hello.go:
package main
import . "huru/foo"
func main() {
Foo()
}
foo / side.go:
package foo
import "fmt"
func Foo() {
fmt.Println("Hello from side.go");
}
答案 1 :(得分:3)
您不能使用main
作为huru/foo/side.go
的程序包名称,因为它已经在路径与huru/hello.go
所在的side.go
中使用。
因此,在huru/foo/side.go
文件上更改程序包名称。 Better to use folder name as the package name。
package foo
func Foo() {
}
然后在huru/hello.go
上导入huru/foo
包,这样就可以使用内部文件中定义的Foo()
函数了。
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/mux"
"huru/foo" // <------ here
)
func main(){
foo.Foo()
}