我明白這個問題,根據回答here,然而,我真的可以使用幫助或更詳細的代碼解釋如何克服它。克服進口週期不允許在Go
我的情況是這樣的:我曾經有模型和控制器分離,並在我的模型包我有包含的所有模型功能的接口datastore.go文件:
package models
type DSDatabase interface {
CreateUser(ctx context.Context, username string, password []byte) (*datastore.Key, error)
// More model functions
}
type datastoreDB struct {
client *datastore.Client
}
var (
DB DSDatabase
_ DSDatabase = &datastoreDB{}
)
func init() {
// init datastore
}
這是所有罰款因爲模型功能也位於模型包中,所以我在控制器包中的功能可以自由調用models.DB.CreateUser(ctx, "username", []byte("password"))
。
現在,我決定將所有上述代碼移至datastore
包,而CreateUser
的型號位於user
包中。換句話說,package user
現在包含控制器和模型功能,控制器相關功能依賴於datastore
包,而DSDatabase
接口依賴於user
模型功能。
我真的很想知道如何克服導入週期,同時保持DSDatastore
界面與其他所有軟件包(如home
和user
)分離。
的情況下,上述的不夠清晰,上面的代碼已更改爲:
package datastore
import (
"github.com/username/projectname/user"
)
type DSDatabase interface {
user.CreateUser(ctx context.Context, username string, passwoUserRegister(ctx context.Context, username string, password []byte) (*datastore.Key, error)
}
...
,而在我的user
包我有這個控制器中的相關文件:
和另一個型號相關文件我有:
package user
import (
"github.com/username/projectname/datastore"
)
func (db *datastore.datastoreDB) CreateUser(ctx context.Context, username string) (*User, error) {
key := datastore.NameKey("User", username, nil)
var user User
err := db.client.Get(ctx, key, &user)
if err != nil {
return nil, err
}
return &user, nil
}
其中在進口週期過程的結果,我可悲的是無法弄清楚如何首先克服..
你似乎在尋找技術解決方案,但你真的需要更好地界定哪些軟件包使用該。用術語來說,感覺就好像數據存儲是最低級別的,並且不會了解其他軟件包。但我無法真正瞭解您的業務邏輯。另外,在用戶包中有一個datastoreDB接收器感覺很奇怪。也許這種方法應該在數據存儲包中?也許代碼應該只在同一個包中?如果你看看現實生活中的項目,他們在同一個軟件包中有大量的文件。 – alexbt
如果數據存儲和用戶都需要對方,那麼他們根本不能分開包。爲什麼他們首先在不同的包裝中? – JimB
@alexbt在我使用MVC結構之前,我喜歡將控制器和模型放在一起的想法[按照我早期的問題推薦](https://stackoverflow.com/questions/43295691/identical-package-names-in-不同的文件夾爲同一項目)..datastore.go文件還包含配置,以創建一個單一的數據存儲客戶端,我可以使用datastoreDB接收器訪問..但它聽起來像我需要回去和'用戶模型函數和用戶控制器函數來分離包? – fisker