[golang]一个修改

今天看了 2018 go conf 的演讲, 其中一个讲到 如何去组织项目的结构 :https://about.sourcegraph.com/go/gophercon-2018-how-do-you-structure-your-go-apps/ 觉得挺实用的,代码在这里:https://github.com/katzien/go-structure-examples 尝试运行这个项目中的 layered 的目录的时候,我把一些包的引入的路径改为本地的,发现报了一个错。

  1. 出现错误:import cycle not allowed,这个错误之前也遇见过,在这里记录一下。
import cycle not allowed
package main
imports go-structure-examples/handlers
imports go-structure-examples/models
imports go-structure-examples/layered/storage
imports go-structure-examples/layered/models
imports go-structure-examples/layered/storage
imports go-structure-examples/layered/models

原因:因为 models 包里面引用了 storage 包, 然后 storage 包也引用了 models 包,出现了循环的引用依赖,进入了死循环。 解决方法:引入第三个包 exchange, 在 exchange 包里面去引用 models 包 和 storage 包。

具体步骤: 1.1 在项目目录下新建包:exchange

代码:

package exchange

//StorageType defines available storage types
import (
    "mvc_layered/models"
    "mvc_layered/storage"
)
type StorageType int

const (
    //JSON will store data in JSOn files saved on disk
    JSON StorageType = iota

    // Memory will store data in memory
    Memory
)

//DB is an interface to interact with data on multiple layered of data storage

var DB Storage

//Storage represents all possible actions available to deal with data
type Storage interface{
    SaveBeer(...models.Beer) error
    SaveReview(...models.Review) error
    FindBeer(models.Beer)([]*models.Beer, error)
    FindReview(models.Review)([]*models.Review, error)
    FindBeers() []models.Beer
    FindReviews() []models.Review
}

func NewStorage(storageType StorageType) error{
    switch storageType{
    case Memory:
        DB = new(storage.Memory)

    case JSON:
        _, err := storage.NewJSON("./data/")
        if err != nil{
            return err
        }
    }
    return nil
}

1.2. 主要是把 models 包下的 storage.go 下的代码放在 exchange 了,所以去掉 models 目录下的 storage.go 文件 1.3. storage 目录下的两个文件需要修改一下, 还有其他的文件根据错误提示稍微修改一下。 1.4 整个项目调试一下,全部可以走通了。