a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > Golang > 正文

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

2020-04-01 18:54:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

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

1. 應(yīng)用場(chǎng)景

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

A 是應(yīng)用程序的框架級(jí)結(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 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 依賴(lài) package b 和 package c,同時(shí) package b 依賴(lài) package a 、 package c 也依賴(lài) package a 。

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

package mainimport "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)在的問(wèn)題是:

A depends on B 
B depends on A

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

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

經(jīng)過(guò)上面的步驟處理后, 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 中補(bǔ)充可能缺少的方法;

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

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

A depends on C 
C depends on A

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

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

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

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

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

方法移動(dòng)到 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隨之改成調(diào)用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)}

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

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

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

5. 總結(jié)

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

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

總結(jié)

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄色a视频 | 国产一区二区三区久久久久久久久 | 欧美一区二区大片 | 人人干网站 | 色综合天天天天做夜夜夜夜做 | 久草视频在线资源站 | 黄色影视在线观看 | 不卡在线 | 精品国产精品三级精品av网址 | 日韩一级免费观看 | 玩色男孩 | 欧美 日韩 高清 | 91亚洲精| 在线视频一区二区三区 | 亚洲黄色三级 | 久久一区二区三区四区 | 欧美日韩在线免费观看 | 日韩亚洲一区二区 | 日韩精品免费一区二区夜夜嗨 | 免费看国产一级特黄aaaa大片 | 久久精品免费一区二区 | 亚洲午夜激情网 | 久久人人爽av | 一区二区三区亚洲 | av福利在线观看 | 在线免费看污网站 | 涩涩婷婷 | 日韩免费在线视频 | 日本一区二区三区中文字幕 | 久草.com| 精品国产乱码久久久久久久 | 成人做爰9片免费视频 | 成人aaaa | 久久窝 | 国产污视频网站 | 国产一区二区观看 | 精品久久久久久久久久久久久久 | 中国免费看的片 | 中文字幕日韩一区二区 | 免费观看一级特黄欧美大片 | 日本一区二区成人 |