校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Golang報(bào)“import cycle not allowed”錯(cuò)誤的2種解決方法

Golang報(bào)“import cycle not allowed”錯(cuò)誤的2種解決方法

熱門標(biāo)簽:浙江高速公路地圖標(biāo)注 地圖標(biāo)注的汽車標(biāo) 廣州呼叫中心外呼系統(tǒng) 西部云谷一期地圖標(biāo)注 學(xué)海導(dǎo)航地圖標(biāo)注 南通如皋申請開通400電話 中國地圖標(biāo)注省會(huì)高清 高德地圖標(biāo)注口訣 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng)

前言

相信不少 Gopher 在寫 Golang 程序都遇到過 import cycle not allowed 問題,本人最近研讀 go-ethereum 源碼時(shí),發(fā)現(xiàn)定義 interface 也能解決此問題, 還能解決連分包都不能解決的情況, 并且比分包更加簡單快捷。下面逐個(gè)講解 分包 和 定義接口 這兩種方法。

1. 應(yīng)用場景

假設(shè)有如下使用場景:

A 是應(yīng)用程序的框架級結(jié)構(gòu)體,在 A 包含子模塊 B 和 C 的指針;

B 為了方便的使用應(yīng)用的其他子模塊(比如 C )功能,所以在其結(jié)構(gòu)體包含了 A 的指針;

C 要調(diào)用 A 包中的某個(gè)方法;

2. 代碼實(shí)現(xiàn)

其程序大致如下:

package a 代碼如下:

package a

import (
 "fmt"

 "github.com/ggq89/mutualdep/b"
 "github.com/ggq89/mutualdep/c"
)

type A struct {
 Pb *b.B
 Pc *c.C
}

func New(ic int) *A {
 a := A{
 Pc: c.New(ic),
 }

 a.Pb = b.New(a)

 return a
}

func Printf(v int) {
 fmt.Printf("%v", v)
}

package b 代碼如下:

package b

import (
 "github.com/ggq89/mutualdep/a"
)

type B struct {
 Pa *a.A
}

func New(a *a.A) *B {
 return B{
 Pa: a,
 }
}

func (b *B) DisplayC() {
 b.Pa.Pc.Show()
}

package c 代碼如下:

package c

import "github.com/ggq89/mutualdep/a"

type C struct {
 Vc int
}

func New(i int) *C {
 return C{
 Vc: i,
 }
}

func (c *C) Show() {
 a.Printf(c.Vc)
}

package a 依賴 package b 和 package c,同時(shí) package b 依賴 package a 、 package c 也依賴 package a 。

main 函數(shù)代碼如下:

package main

import "github.com/ggq89/mutualdep/a"

func main() {
 a := a.New(3)
 a.Pb.DisplayC()
}

編譯時(shí)就會(huì)報(bào)錯(cuò)如下:

import cycle not allowed
package main
    imports github.com/ggq89/mutualdep/a
    imports github.com/ggq89/mutualdep/b
    imports github.com/ggq89/mutualdep/a

3. 定義接口

現(xiàn)在的問題是:

A depends on B
B depends on A

對于 A struct 和 B struct 有彼此的指針這種相互依賴問題,可以使用定義接口的方法解決,具體步驟如下:

在 package b 中 定義 a interface ; 將 b 所有使用到結(jié)構(gòu)體 a 的變量和方法的地方全部轉(zhuǎn)化成 使用接口 a 的方法;在 a interface 中補(bǔ)充缺少的方法;

經(jīng)過上面的步驟處理后, package b 代碼如下:

package b

import (
 "github.com/ggq89/mutualdep/c"
)

type B struct {
 Pa a
}

type a interface {
 GetC() *c.C
}

func New(a a) *B {
 return B{
 Pa:a,
 }
}

func (b *B) DisplayC() {
 b.Pa.GetC().Show()
}

在 package a 中補(bǔ)充可能缺少的方法;

處理后, package a 中的代碼如下:

package a

import (
 "fmt"

 "github.com/ggq89/mutualdep/b"
 "github.com/ggq89/mutualdep/c"
)

type A struct {
 Pb *b.B
 Pc *c.C
}

func New(ic int) *A {
 a := A{
 Pc:c.New(ic),
 }

 a.Pb = b.New(a)

 return a
}

func (a *A)GetC() *c.C {
 return a.Pc
}

func Printf(v int) {
 fmt.Printf("%v", v)
}

4. 拆分包

再次編譯,提示如下:

import cycle not allowed
package main
    imports github.com/ggq89/mutualdep/a
    imports github.com/ggq89/mutualdep/b
    imports github.com/ggq89/mutualdep/c
    imports github.com/ggq89/mutualdep/a

現(xiàn)在是另一個(gè)相互依賴問題:

A depends on C
C depends on A

與前面的相互依賴不同,前面的依賴是由于 A struct 和 B struct 有彼此的指針導(dǎo)致的,屬于硬相互依賴;

而這里是由于 package c 中的方法調(diào)用 package a 中的方法引起的,屬于軟相互依賴;

  • 這種相互依賴可以通過將方法拆分到另一個(gè)包的方式來解決;在拆分包的過程中,可能會(huì)將結(jié)構(gòu)體的方法轉(zhuǎn)化為普通的函數(shù);

引入 package f , 將方法遷移到 f 中 :

package f

import "fmt"

func Printf(v int) {
 fmt.Printf("%v", v)
}

方法移動(dòng)到 package f 后, package a 的代碼如下:

package a

import (
 "github.com/ggq89/mutualdep/b"
 "github.com/ggq89/mutualdep/c"
)

type A struct {
 Pb *b.B
 Pc *c.C
}

func New(ic int) *A {
 a := A{
 Pc: c.New(ic),
 }

 a.Pb = b.New(a)

 return a
}

func (a *A) GetC() *c.C {
 return a.Pc
}

package c隨之改成調(diào)用package f,其代碼如下:

package c

import (
 "github.com/ggq89/mutualdep/a/f"
)

type C struct {
 Vc int
}

func New(i int) *C {
 return C{
 Vc: i,
 }
}

func (c *C) Show() {
 f.Printf(c.Vc)
}

現(xiàn)在依賴關(guān)系如下:

A depends on B and C
B depends on C
C depends on F

至此,兩種包相互依賴關(guān)系都得以解決。

5. 總結(jié)

對于軟相互依賴,利用分包的方法就能解決,有些函數(shù)導(dǎo)致的相互依賴只能通過分包解決;分包能細(xì)化包的功能;

對于硬相互依賴只能通過定義接口的方法解決;定義接口能提高包的獨(dú)立性,同時(shí)也提高了追蹤代碼調(diào)用關(guān)系的難度;

參考文章:

  • golang不允許循環(huán)import問題(“import cycle not allowed”) : https://www.jb51.net/article/145536.htm
  • golang解決import cycle not allowed的一種思路 : https://www.jb51.net/article/145539.htm

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 對Golang import 導(dǎo)入包語法詳解
  • go各種import的使用方法講解
  • golang 之import和package的使用
  • MongoDB使用mongoexport和mongoimport命令,批量導(dǎo)出和導(dǎo)入JSON數(shù)據(jù)到同一張表的實(shí)例
  • golang中import cycle not allowed解決的一種思路
  • 詳解golang避免循環(huán)import問題(“import cycle not allowed”)
  • 如何解決django配置settings時(shí)遇到Could not import settings ''conf.local''
  • Golang import 導(dǎo)入包語法及一些特殊用法詳解

標(biāo)簽:吐魯番 德宏 貴州 常州 東營 曲靖 許昌 保定

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang報(bào)“import cycle not allowed”錯(cuò)誤的2種解決方法》,本文關(guān)鍵詞  Golang,報(bào),import,cycle,not,allowed,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang報(bào)“import cycle not allowed”錯(cuò)誤的2種解決方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang報(bào)“import cycle not allowed”錯(cuò)誤的2種解決方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    粉嫩嫩av羞羞动漫久久久 | 亚洲午夜激情网站| 欧美日本在线观看| 成人av电影观看| 久久狠狠亚洲综合| 久久婷婷久久一区二区三区| 色综合天天天天做夜夜夜夜做| 亚洲成a人片在线观看中文| www久久精品| 日韩一区二区影院| 欧美亚洲综合色| 国产馆精品极品| 国产精品中文欧美| 免费人成精品欧美精品 | 久久综合999| 久久欧美一区二区| 欧美日韩一区高清| 成人激情动漫在线观看| 岛国av在线一区| 狠狠色综合日日| 免费成人在线观看视频| 亚洲欧美国产三级| 亚洲一区二区三区激情| 中文字幕亚洲不卡| 欧美极品xxx| 久久久噜噜噜久久人人看| 国产精品三级av在线播放| 7777精品伊人久久久大香线蕉超级流畅| 狠狠色综合播放一区二区| 国产偷v国产偷v亚洲高清| 亚洲人xxxx| 国产精品美女久久久久久久| 国产午夜一区二区三区| 欧美一区二区三区在线| 欧美午夜精品电影| 国产成人av网站| 欧美自拍偷拍午夜视频| 欧美在线色视频| 91在线国内视频| 欧美sm极限捆绑bd| 久久久亚洲精品石原莉奈| 久久综合九色综合97婷婷女人| 成人免费在线视频观看| 亚洲男人天堂av| 亚洲成人综合网站| 国产网站一区二区| 国产精品嫩草影院com| 中文一区一区三区高中清不卡| 亚洲欧洲在线观看av| 亚洲影视在线观看| 中文字幕成人在线观看| 麻豆91小视频| 成人高清av在线| 欧美性生活大片视频| 欧美经典一区二区| 亚洲图片另类小说| 奇米精品一区二区三区在线观看| 91视频在线观看免费| 欧美绝品在线观看成人午夜影视| 欧美成人一区二区三区片免费| 中文字幕一区日韩精品欧美| 一个色在线综合| 黑人巨大精品欧美一区| 亚洲福利一二三区| 在线日韩av片| 精品国产麻豆免费人成网站| 日本一区二区三区国色天香| 精品中文av资源站在线观看| 岛国精品在线观看| 3d动漫精品啪啪一区二区竹菊| 久久网站最新地址| 韩国成人在线视频| 欧美在线啊v一区| 国产三区在线成人av| 中文在线一区二区| 国产一区二区三区久久久| jlzzjlzz国产精品久久| 欧美日韩一区视频| 一区二区在线观看视频| 成人黄色网址在线观看| 日韩一级大片在线| 亚州成人在线电影| 91精品婷婷国产综合久久竹菊| 欧美激情一区二区三区四区| 久久精工是国产品牌吗| 亚洲一区二区三区中文字幕| 欧美无砖专区一中文字| ●精品国产综合乱码久久久久 | 国产精品久久久久久久久快鸭| 看电影不卡的网站| www国产精品av| 日韩和欧美的一区| 91国产福利在线| 欧美乱妇一区二区三区不卡视频| 亚洲国产激情av| 午夜久久久影院| bt欧美亚洲午夜电影天堂| 亚洲欧洲综合另类在线| 国产成人在线免费观看| 久久久久国产精品厨房| 国产欧美日韩不卡| 成人免费电影视频| 久久久久久久免费视频了| 奇米色一区二区三区四区| 不卡在线观看av| 日韩电影在线免费看| 91国产免费看| 亚洲第一成人在线| 欧美日韩国产大片| 久久99精品久久久久久国产越南| 欧美午夜精品一区| 亚洲成人精品一区二区| 国产亚洲视频系列| 国产suv精品一区二区6| 国产午夜精品福利| 欧美日韩久久久| 美国十次综合导航| 精品国产一区二区三区四区四| 中文在线资源观看网站视频免费不卡 | 欧美色综合久久| 欧美色倩网站大全免费| 日韩午夜激情视频| 国产一区二区三区美女| 最近中文字幕一区二区三区| 欧美性生活一区| 国产美女视频一区| 成人欧美一区二区三区1314| 欧美高清视频在线高清观看mv色露露十八 | 午夜欧美大尺度福利影院在线看| 精品剧情v国产在线观看在线| 91在线视频免费91| 老司机精品视频导航| 亚洲欧洲中文日韩久久av乱码| 91精品国产综合久久福利| 色综合天天综合狠狠| 狠狠久久亚洲欧美| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲美女少妇撒尿| 国产精品对白交换视频| 欧美精品一区男女天堂| 欧美一区二区三区色| 欧美亚洲尤物久久| 91精品福利视频| 成人午夜视频在线观看| 国产精品一品二品| 韩国v欧美v亚洲v日本v| 另类综合日韩欧美亚洲| 丝袜亚洲另类欧美| 亚洲国产视频一区二区| 一区二区三区在线免费观看| 国产精品美女久久福利网站| 欧美国产欧美综合| 国产人久久人人人人爽| 国产喂奶挤奶一区二区三区 | 国产一区二区三区四区五区入口| 偷拍日韩校园综合在线| 婷婷一区二区三区| 五月天视频一区| 日本欧美久久久久免费播放网| 亚洲一区二区欧美| 五月天一区二区三区| 日本不卡视频在线| 久久国产精品无码网站| 激情成人综合网| 成人中文字幕电影| 色综合天天综合网国产成人综合天 | 国产精品卡一卡二卡三| 国产精品入口麻豆九色| 中文字幕亚洲不卡| 亚洲免费av网站| 亚洲aaa精品| 国产裸体歌舞团一区二区| 国产一区二区三区免费| av网站一区二区三区| 91黄色激情网站| 欧美一级日韩不卡播放免费| 精品国内二区三区| 国产精品大尺度| 亚洲妇女屁股眼交7| 久久99精品久久久久久| 成人av网址在线| 欧美挠脚心视频网站| 久久综合久久久久88| 综合久久给合久久狠狠狠97色 | voyeur盗摄精品| 欧美日韩成人综合天天影院 | 欧美xxx久久| 亚洲婷婷综合久久一本伊一区| 亚洲综合一区二区三区| 久久99精品一区二区三区三区| 成人av在线观| 日韩免费看的电影| 中文字幕一区在线| 久久精品国产第一区二区三区| 国产成+人+日韩+欧美+亚洲| 欧美日精品一区视频| 国产亚洲精品资源在线26u| 亚洲成人在线观看视频| 不卡视频一二三| 久久品道一品道久久精品|