亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang報“import cycle not allowed”錯誤的2種解決方法

2020-04-01 18:54:55
字體:
來源:轉載
供稿:網友

前言

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

1. 應用場景

假設有如下使用場景:

A 是應用程序的框架級結構體,在 A 包含子模塊 B 和 C 的指針;

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

C 要調用 A 包中的某個方法;

2. 代碼實現

其程序大致如下:

package a 代碼如下:

package aimport ( "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 bimport ( "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 cimport "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,同時 package b 依賴 package a 、 package c 也依賴 package a 。

main 函數代碼如下:

package mainimport "github.com/ggq89/mutualdep/a"func main() { a := a.New(3) a.Pb.DisplayC()}

編譯時就會報錯如下:

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. 定義接口

現在的問題是:

A depends on B 
B depends on A

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

在 package b 中 定義 a interface ; 將 b 所有使用到結構體 a 的變量和方法的地方全部轉化成 使用接口 a 的方法;在 a interface 中補充缺少的方法;

經過上面的步驟處理后, package b 代碼如下:

package bimport ( "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 中補充可能缺少的方法;

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

package aimport ( "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

現在是另一個相互依賴問題:

A depends on C 
C depends on A

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

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

  • 這種相互依賴可以通過將方法拆分到另一個包的方式來解決;在拆分包的過程中,可能會將結構體的方法轉化為普通的函數;

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

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

方法移動到 package f 后, package a 的代碼如下:

package aimport ( "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隨之改成調用package f,其代碼如下:

package cimport ( "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)}

現在依賴關系如下:

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

至此,兩種包相互依賴關系都得以解決。

5. 總結

對于軟相互依賴,利用分包的方法就能解決,有些函數導致的相互依賴只能通過分包解決;分包能細化包的功能;

對于硬相互依賴只能通過定義接口的方法解決;定義接口能提高包的獨立性,同時也提高了追蹤代碼調用關系的難度;

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩av在线播放| 91精品国产91久久久久福利| 2018中文字幕一区二区三区| 久久九九全国免费精品观看| 亚洲第一天堂无码专区| 国产精品久久久久影院日本| 在线观看欧美日韩国产| 亚洲国产一区二区三区在线观看| 国产成人精品日本亚洲专区61| 美女福利精品视频| 亚洲一区999| 欧美电影免费在线观看| 日韩在线视频观看正片免费网站| 欧美最猛性xxxxx(亚洲精品)| 欧美一级淫片丝袜脚交| 国产视频丨精品|在线观看| 亚洲影院色无极综合| 日韩福利伦理影院免费| 欧美—级高清免费播放| 久久亚洲欧美日韩精品专区| 亚洲天堂免费在线| 中文字幕亚洲一区| 日韩免费av一区二区| 亚洲a成v人在线观看| 国产日韩欧美成人| 国产成人精品国内自产拍免费看| 久久精品视频在线观看| 国产精品久久久久久久久久小说| 国产精品视频中文字幕91| 最近中文字幕mv在线一区二区三区四区| 欧美激情一二三| 国产乱肥老妇国产一区二| 亚洲女人天堂色在线7777| 国产网站欧美日韩免费精品在线观看| 国产啪精品视频网站| 亚洲社区在线观看| 欧美极品少妇xxxxⅹ喷水| 国产91九色视频| 欧美精品电影在线| 美女999久久久精品视频| 亚洲aⅴ男人的天堂在线观看| 日韩中文字幕国产| 成人综合国产精品| 欧美二区乱c黑人| 亚洲老司机av| 国产精品黄页免费高清在线观看| 亚洲国产精品悠悠久久琪琪| 国产成人精品久久二区二区| 国产91精品视频在线观看| 国产亚洲精品久久久久动| 欧美日韩中国免费专区在线看| 日韩精品欧美国产精品忘忧草| 在线国产精品视频| 日本19禁啪啪免费观看www| 亚洲国产女人aaa毛片在线| 在线观看日韩www视频免费| 亚洲高清av在线| 日韩专区中文字幕| 91精品国产自产在线老师啪| 狠狠色香婷婷久久亚洲精品| 美女福利视频一区| 中文字幕国产日韩| 国产精品高潮呻吟视频| 亚洲国产中文字幕在线观看| 国产精品九九久久久久久久| 欧美成人国产va精品日本一级| 久久精品99久久香蕉国产色戒| 亚洲剧情一区二区| 欧美色视频日本高清在线观看| 亚洲一区亚洲二区亚洲三区| 欧美人成在线视频| 人人爽久久涩噜噜噜网站| 国产精品亚洲第一区| 在线看欧美日韩| 久久全国免费视频| 国产99久久精品一区二区| 色偷偷噜噜噜亚洲男人的天堂| 久久久久久久久久国产精品| 欧美老女人www| 777午夜精品福利在线观看| 亚洲精品国产欧美| www日韩欧美| 欧美日韩亚洲成人| 欧洲亚洲女同hd| 97在线视频观看| 亚洲国产精品福利| 91免费视频国产| 久久国产一区二区三区| 国产精品一区二区三区在线播放| 秋霞av国产精品一区| 亚洲成人久久网| 久久99热精品这里久久精品| 大桥未久av一区二区三区| 亚洲成人黄色网址| 亚洲精品美女视频| 国产精自产拍久久久久久蜜| 日韩专区中文字幕| 在线视频亚洲欧美| 俺去了亚洲欧美日韩| 国产69久久精品成人看| 国产精品最新在线观看| 久久精品国产91精品亚洲| 26uuu国产精品视频| 最近更新的2019中文字幕| 亚洲国产成人精品女人久久久| 亚洲黄页网在线观看| 久久久www成人免费精品张筱雨| 韩国国内大量揄拍精品视频| 91在线国产电影| 久久五月情影视| 在线精品视频视频中文字幕| 亚洲国产欧美久久| 国产精品视频在线观看| 午夜免费日韩视频| 青青精品视频播放| 亚洲free嫩bbb| 国产精品人成电影| 亚洲人成电影网站色xx| 久精品免费视频| 国产精品美女呻吟| 国产亚洲精品久久久优势| 色樱桃影院亚洲精品影院| 国产91色在线|免| 亚洲国产精品大全| 91极品视频在线| 中文字幕欧美视频在线| 2020欧美日韩在线视频| 高跟丝袜一区二区三区| 精品久久久久久国产| 亚洲精品久久久久久久久久久久| 国产精品www| 精品视频在线播放| 亚洲精品久久久一区二区三区| 日韩中文字幕av| 久久99青青精品免费观看| 最近2019中文字幕大全第二页| 日韩电影视频免费| 久久久久久久91| 国产99视频精品免视看7| 国产欧美日韩视频| 欧美亚洲在线观看| 欧美老少做受xxxx高潮| 久久天天躁狠狠躁夜夜躁| 久久综合伊人77777| 欧美精品aaa| 91免费在线视频网站| 欧美老少配视频| 日韩小视频在线观看| 亚洲成人久久一区| 欧美精品久久久久久久免费观看| 尤物99国产成人精品视频| 91中文在线观看| 久久久免费在线观看| 日韩av在线不卡| 欧美日韩一二三四五区| 国产日韩一区在线| 国产精品电影在线观看| 精品国产一区久久久| 久久频这里精品99香蕉| 日韩成人在线视频网站| 日韩中文有码在线视频| 中文国产成人精品久久一| 国产精品678| 亚洲色在线视频|