婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang報“import cycle not allowed”錯誤的2種解決方法

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

熱門標簽:浙江高速公路地圖標注 地圖標注的汽車標 廣州呼叫中心外呼系統 西部云谷一期地圖標注 學海導航地圖標注 南通如皋申請開通400電話 中國地圖標注省會高清 高德地圖標注口訣 江西轉化率高的羿智云外呼系統

前言

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

1. 應用場景

假設有如下使用場景:

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

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

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

2. 代碼實現

其程序大致如下:

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

main 函數代碼如下:

package main

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

處理后, 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

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

A depends on C
C depends on A

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

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

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

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

package f

import "fmt"

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

方法移動到 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隨之改成調用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)
}

現在依賴關系如下:

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

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

5. 總結

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

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

參考文章:

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

總結

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

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

標簽:吐魯番 德宏 貴州 常州 東營 曲靖 許昌 保定

巨人網絡通訊聲明:本文標題《Golang報“import cycle not allowed”錯誤的2種解決方法》,本文關鍵詞  Golang,報,import,cycle,not,allowed,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang報“import cycle not allowed”錯誤的2種解決方法》相關的同類信息!
  • 本頁收集關于Golang報“import cycle not allowed”錯誤的2種解決方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩免费观看一区三区| 亚洲成人777| 久久午夜免费电影| 亚洲视频在线观看三级| 免费在线观看日韩欧美| 久久国产夜色精品鲁鲁99| 国产婷婷精品av在线| 日韩在线一区二区| 日韩国产精品久久| 精品国产亚洲在线| 欧美中文字幕一区| 久久av中文字幕片| 亚洲欧洲精品天堂一级| 久久国产精品色婷婷| 日韩免费看的电影| 黄色成人免费在线| 伊人色综合久久天天| 色综合网站在线| 国产最新精品精品你懂的| 国产精品三级视频| 欧美v国产在线一区二区三区| 91精品国产乱码| 在线观看视频一区二区| 国产精品中文字幕欧美| 国产精品高潮呻吟久久| 欧美日韩国产综合一区二区三区 | 国产精品原创巨作av| 亚洲免费观看高清完整版在线观看 | 精品视频一区二区三区免费| 国产精品主播直播| 免费成人美女在线观看| 成人免费视频网站在线观看| va亚洲va日韩不卡在线观看| 久久99最新地址| 日韩成人免费电影| 不卡的电影网站| 678五月天丁香亚洲综合网| 国产喷白浆一区二区三区| 最好看的中文字幕久久| 亚洲欧美一区二区视频| 1024亚洲合集| 欧美日韩综合色| 日韩久久精品一区| 国产一区 二区| 日韩欧美123| 午夜精品福利一区二区蜜股av| 久久精品999| 欧美一级欧美三级| 一区二区三区四区在线播放 | 亚洲电影第三页| 在线视频你懂得一区| 国产精品国产三级国产专播品爱网| 亚洲激情五月婷婷| 97精品电影院| 亚洲人一二三区| 成人爱爱电影网址| 国产精品久久久久久久久久免费看| 色综合久久中文综合久久97| 久久久亚洲精华液精华液精华液| 日韩精品三区四区| 亚洲视频你懂的| 在线亚洲一区二区| 亚洲国产精品激情在线观看 | 日韩精品色哟哟| 日韩福利电影在线| 91精品在线免费| 狠狠久久亚洲欧美| 亚洲免费色视频| 欧美一区二区三区四区久久| 极品少妇xxxx精品少妇偷拍| 欧美精品一区二区久久婷婷| 日本亚洲一区二区| 欧美在线999| 麻豆精品在线观看| 亚洲三级在线免费观看| 成人av网站在线观看免费| 日韩一区中文字幕| 日韩欧美国产电影| 成人国产亚洲欧美成人综合网 | 欧美精品一卡二卡| 欧美日韩一区 二区 三区 久久精品| 亚洲日本免费电影| 日韩精品一区二区三区四区| 国产日韩欧美不卡在线| 99精品欧美一区二区三区综合在线| 国产日韩亚洲欧美综合| 9191久久久久久久久久久| 成人一区二区三区在线观看 | 午夜精品福利一区二区蜜股av| 亚洲黄色片在线观看| 亚洲精品久久久蜜桃| 一区二区三区丝袜| 午夜欧美在线一二页| 日本亚洲欧美天堂免费| 狠狠色狠狠色综合日日91app| 丝袜诱惑制服诱惑色一区在线观看| 亚洲国产乱码最新视频| 日韩电影一区二区三区四区| 日本欧美肥老太交大片| 国产精品66部| 久久这里都是精品| 国产91在线观看| 亚洲女厕所小便bbb| 亚洲精品在线网站| 国产视频视频一区| 欧美日韩大陆在线| 麻豆成人久久精品二区三区小说| 欧美激情在线一区二区三区| 91精品国产一区二区| 欧美日韩三级在线| 欧美日韩在线不卡| 中文在线资源观看网站视频免费不卡 | 午夜成人免费视频| 视频一区二区中文字幕| 午夜不卡av免费| 97成人超碰视| 自拍av一区二区三区| 国产毛片精品视频| 91免费看`日韩一区二区| 欧美日韩精品欧美日韩精品一| 日韩三级在线观看| 麻豆精品一二三| 欧美日韩二区三区| 亚洲精品一区二区三区福利 | 亚洲国产成人午夜在线一区| 亚洲欧洲一区二区在线播放| 日本视频一区二区| 国产99久久久精品| 国产亚洲欧美中文| 国产盗摄视频一区二区三区| 欧美精三区欧美精三区| 国产精品每日更新在线播放网址 | 欧美电视剧在线看免费| 国产成人亚洲综合a∨婷婷 | 亚洲丝袜制服诱惑| 无吗不卡中文字幕| 欧美日韩久久久一区| 久久精品99国产精品日本| 中文字幕免费一区| 久草这里只有精品视频| 777亚洲妇女| 国内精品国产三级国产a久久| 国产午夜精品一区二区三区视频| 麻豆精品国产91久久久久久 | 欧美aaa在线| 日韩一区二区三区四区 | 欧美综合欧美视频| 在线播放欧美女士性生活| 日韩二区三区四区| 久久精品日韩一区二区三区| 成人丝袜视频网| 日韩电影在线观看电影| 欧美大片一区二区| 91污片在线观看| 激情国产一区二区| 免费的成人av| 亚洲大片在线观看| 欧美精品一区二区高清在线观看| 色狠狠色狠狠综合| 国产在线国偷精品免费看| 亚洲免费在线电影| 欧美一区二区在线免费播放| 蜜桃在线一区二区三区| 亚洲一区二区欧美| 亚洲色图19p| 综合激情网...| 久久综合久久综合久久| 欧美午夜精品一区二区三区| 精品一区二区三区免费毛片爱| 午夜视频一区在线观看| 毛片基地黄久久久久久天堂| 亚洲午夜三级在线| 一区二区激情小说| 中文字幕中文乱码欧美一区二区 | 欧美一区二区女人| 欧美成人精品高清在线播放| 日韩免费性生活视频播放| 91国在线观看| 91在线看国产| 欧美优质美女网站| 这里只有精品电影| 欧美成人三级在线| 日韩欧美美女一区二区三区| 日韩一级黄色大片| 国产午夜亚洲精品午夜鲁丝片| 中文字幕av免费专区久久| 国产日韩欧美一区二区三区综合 | 国产精品性做久久久久久| 色综合久久久久综合体桃花网| 成人精品视频网站| 欧美精品一二三四| 国产精品欧美极品| 日韩高清不卡一区二区三区| 丁香一区二区三区| 91成人在线观看喷潮| 欧美日韩在线三区| 欧美精品vⅰdeose4hd| 国产亚洲精品aa午夜观看| 亚洲综合在线五月| 经典一区二区三区|