詳解golang避免循環(huán)import問(wèn)題(“import cycle not allowed”)
前言
golang不允許循環(huán)import package ,如果檢測(cè)到 import cycle ,會(huì)在編譯時(shí)報(bào)錯(cuò),通常import cycle是因?yàn)樵O(shè)計(jì)錯(cuò)誤或包的規(guī)劃問(wèn)題。
以下面的例子為例,package a依賴package b,同事package b依賴package a
package a import ( "fmt" "github.com/mantishK/dep/b" ) type A struct { } func (a A) PrintA() { fmt.Println(a) } func NewA() *A { a := new(A) return a } func RequireB() { o := b.NewB() o.PrintB() }
package b:
package b import ( "fmt" "github.com/mantishK/dep/a" ) type B struct { } func (b B) PrintB() { fmt.Println(b) } func NewB() *B { b := new(B) return b } func RequireA() { o := a.NewA() o.PrintA() }
就會(huì)在編譯時(shí)報(bào)錯(cuò):
import cycle not allowed
package github.com/mantishK/dep/a
imports github.com/mantishK/dep/b
imports github.com/mantishK/dep/a
現(xiàn)在的問(wèn)題就是:
A depends on B
B depends on A
那么如何避免?
引入package i, 引入interface
package i type Aprinter interface { PrintA() }
讓package b import package i
package b import ( "fmt" "github.com/mantishK/dep/i" ) func RequireA(o i.Aprinter) { o.PrintA() }
引入package c
package c import ( "github.com/mantishK/dep/a" "github.com/mantishK/dep/b" ) func PrintC() { o := a.NewA() b.RequireA(o) }
現(xiàn)在依賴關(guān)系如下:
A depends on B
B depends on I
C depends on A and B
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Golang的循環(huán)語(yǔ)句和循環(huán)控制語(yǔ)句詳解
- 淺談golang for 循環(huán)中使用協(xié)程的問(wèn)題
- golang 跳出多重循環(huán)的高級(jí)break用法說(shuō)明
- golang數(shù)據(jù)結(jié)構(gòu)之golang稀疏數(shù)組sparsearray詳解
- Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法詳解
- golang中for循環(huán)遍歷channel時(shí)需要注意的問(wèn)題詳解
- Golang迭代如何在Go中循環(huán)數(shù)據(jù)結(jié)構(gòu)使用詳解
相關(guān)文章
golang文件服務(wù)器的兩種方式(可以訪問(wèn)任何目錄)
這篇文章主要介紹了golang文件服務(wù)器的兩種方式,可以訪問(wèn)任何目錄,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解
這篇文章主要介紹了Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟
這篇文章主要介紹了golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03Goland項(xiàng)目使用gomod配置的詳細(xì)步驟
Goland是一個(gè)用于Go語(yǔ)言開(kāi)發(fā)的IDE,Goland的項(xiàng)目結(jié)構(gòu)與Go語(yǔ)言的項(xiàng)目結(jié)構(gòu)相似,下面這篇文章主要給大家介紹了關(guān)于Goland項(xiàng)目使用gomod配置的詳細(xì)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04GO語(yǔ)言基礎(chǔ)入門(mén)第一個(gè)go程序解讀
這篇文章主要為大家介紹了GO語(yǔ)言基礎(chǔ)入門(mén)的第一個(gè)go程序解讀,下面來(lái)帶大家進(jìn)入Go語(yǔ)言世界helloworld的大門(mén)吧,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11深入string理解Golang是怎樣實(shí)現(xiàn)的
這篇文章主要為大家介紹了深入string理解Golang是怎樣實(shí)現(xiàn)的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型
這篇文章主要介紹了Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型,根據(jù)Go泛型使用的三步曲提到的:類(lèi)型參數(shù)化、定義類(lèi)型約束、類(lèi)型實(shí)例化我們一步步來(lái)定義我們的緩存結(jié)構(gòu)體,需要的朋友可以參考下2022-07-07