go mod怎么引用同一个项目下面的子目录

怎么在go的子路吗下面引用子包下面的函数

我引用子包出现了 build command-line-arguments: cannot load blog/controller/home: malformed module path "blog/controller/home": missing dot in first path element

相关代码

  • 目录结构
src
    blog
        controller
            home
                IndexController.go
        main.go    
  • 下面是我的main包里面的代码
package main

import (
    "blog/controller/home"  // 这里在goland编辑器编译的时候提升错了
    "github.com/kataras/iris"
    "github.com/kataras/iris/middleware/logger"
    "github.com/kataras/iris/middleware/recover"
    "log"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")
    app.Use(recover.New())
    app.Use(logger.New())

    app.Get("/", home.Index)

    log.Fatal(app.Run(iris.Addr(":8089")))
}
  • go.mod
module blog

go 1.13

require (
    github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a // indirect
    github.com/ajg/form v1.5.1 // indirect
    github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect
    github.com/google/go-querystring v1.0.0 // indirect
    github.com/imkira/go-interpol v1.1.0 // indirect
    github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
    github.com/kataras/iris v0.0.0-20190916050704-df882273e219
    github.com/klauspost/compress v1.8.5 // indirect
    github.com/mattn/go-colorable v0.1.4 // indirect
    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
    github.com/modern-go/reflect2 v1.0.1 // indirect
    github.com/moul/http2curl v1.0.0 // indirect
    github.com/onsi/ginkgo v1.10.2 // indirect
    github.com/onsi/gomega v1.7.0 // indirect
    github.com/sergi/go-diff v1.0.0 // indirect
    github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
    github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 // indirect
    github.com/valyala/fasthttp v1.5.0 // indirect
    github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
    github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
    github.com/xeipuuv/gojsonschema v1.1.0 // indirect
    github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
    github.com/yudai/gojsondiff v1.0.0 // indirect
    github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
    github.com/yudai/pp v2.0.1+incompatible // indirect
)

我的go环境都在同一个目录环境下,为什么还报这个错误呢,我的go版本是 go version go1.13.1 darwin/amd64

提示的错误信息是

go: finding github.com/Shopify/goreferrer latest
go: finding github.com/eknkc/amber latest
go: finding github.com/flosch/pongo2 latest
go: finding github.com/kataras/golog latest
go: finding golang.org/x/crypto latest
go: finding github.com/kataras/pio latest
build command-line-arguments: cannot load blog/controller/home: malformed module path "blog/controller/home": missing dot in first path element

请问各位大佬们我哪里写错了呀

阅读 36.5k
13 个回答

这个是ide的问题,或者是可以配置一下idea,可以在项目的左边点击左侧run project,目前我是直接项目左侧目录单独点击run 或者你们也可以修改一下右上角的配置也可以

新手上路,请多包涵

我是从java转go,新学的,也遇到了该错误,最后经过试验,给出如下结论:
import语句的含义是 import $module/$directory
如,针对oop项目,

 oop
    ├── employee11
    │   └── employee456.go
    ├── go.mod
    └── main.go

go moid init $module, 后面跟的是module名称,这里就代表生成哪个module,可以不是文件夹名称,这里我用的是myoop,即
go mod init myoop, 最后 cat go.mod 如下

module myoop

go 1.13

main.go中,内容如下, 注意import语句

package main

import em "myoop/employee11"

func main() {
    e := em.Employee {
        FirstName: "Sam",
        LastName: "Adolf",
        TotalLeaves: 30,
        LeavesTaken: 20,
    }
    e.LeavesRemaining()
}

最后附employee456.go代码,最终希望大家能理解背后的含义:

package employee123

import "fmt"

type Employee struct {
    FirstName string
    LastName string
    TotalLeaves int
    LeavesTaken int
}

func (e Employee) LeavesRemaining() {
    fmt.Printf("%s %s has %d leaves remaining\n", e.FirstName, e.LastName, e.TotalLeaves - e.LeavesTaken)
}

写法是没错的。这个错误很多情况下会发生。

其中之一可能是 GOROOT 设置错误了。go env 确认下 GOROOT 的设置,不正确的话,重新设置下。

其实,近期的 Go 版本中,GOROOT 已经不用设置了,默认会根据 go 命令自动确认 GOROOT 的位置。所以,如果想快速检查是不是这个问题,直接 unset GOROOT 就好了,相当于取消了你的手动配置,使用了默认的 GOROOT。


被人踩了,本来没准备补充,再来解释下吧。

这个错误有很多情况可能发生,如果手动设置了 goroot,并且设置错了,也可能这个错误,还是其他的,比如在 go1.13 上,引入 mod 的名称不是标准的域名也会报错,还有如果引入的 mod 下的包不存在也可能报这个错误,比如 blog/controller/home 不存在的话,可能会报这个错。

上面说的 goroot 只是一种情况,并非是所有情况。反正就是,情况比较多,因为这个错误提示的不够好,Go 的作者也在优化这个提示。

而且,现在看来题主的这个问题,我觉得是 goroot 设置的可能性更大些。其他的回答,之所以解决了问题,可能是 IDE 和手动运行的环境变量不同,所以通过 idea 可以执行。但并没有了解到问题的本质。

你可以测试下 goroot 设置错误的情况,是否会报这个错误,用题目中的目录结构和指定的 Go 版本。

我不知道这算不算误导别人,只是后来没有重新修改这个答案,而且大部分人包这个错误,并非这种情况

另外一个相关回答,可以看看:https://segmentfault.com/q/10...


关于 GOROOT,我曾经写过一篇文章,有一部分提到过这个问题,详细聊聊如何安装 Go,有兴趣可以看看。

新手上路,请多包涵

IDE设置Go Modules,如下图image

请补充go.mod的文件内容

设置环境变量GO111MODULE=on应该就可以了

新手上路,请多包涵
新手上路,请多包涵

所以楼主解决了么,答案是什么?

新手上路,请多包涵

楼主解决问题没,我也遇到了相同的问题,还没解决,所以想寻求答案

新手上路,请多包涵

遇到同样的问题了,有人解决了吗?

新手上路,请多包涵

你的 go.mod 是在 blog 目录下吗?
src

blog
    controller
        home
            IndexController.go
    main.go
    go.mod
新手上路,请多包涵

遇到了同样的问题,等大神分享下方法。

新手上路,请多包涵

go mod init "当前文件夹名"

举一个例子;go项目目录:

 oop
    ├── server.go
    ├── go.mod
    └── main.go

我在main.go在里面怎么引用server.go这个文件呢?
难道我sever.go的package要和main.go一样?
也不行。
然后我就改成了:

 oop
    ├── server
    │   └── server.go
    ├── go.mod
    └── main.go

加个文件夹。
然后go mod init oop;
在main.go里引用server就改成了

import (
    server "oop/server"
)

加了个文件夹。

然后在文件夹里,package就要一样了,你在这里可以拆分多个文件,写多个函数。

拜拜┏(^0^)┛

推荐问题
宣传栏