Is it possible to do something like a "mutual" package import in Golang?
Lets say for example I have two packages, A and B with functions AFunc and BFunc, BFunc2
package A
import "B"
func AFunc() {
//do stuff but also use
B.BFunc()
}
-
package B
import "A"
func BFunc() {
//do foo
}
func BFunc2() {
//do different stuff but also use
A.AFunc()
}
Is there a way to achieve this without using a third package as "bridge"?
Edit:
To clarify the question a bit, this is of course not possible by "simply doing" it since the compiler will throw an import cycle not allowed
error. The question is, is there a cleaner or more established way of working around this problem then building a "bridge package"?
interface should be an obvious answer: as long as both packages propose interfaces with a common set of functions, it allows for:
packageB
to use functions from A
(import A
)packageA
to call functions from B
without having to import B
: all it need to be passed B
instances which implements an interface defined in A
: those instances will be views as A
object.packageA
ignores the existence of packageB
.This is also illustrated in the comment of "Cyclic dependencies and interfaces in golang".
If package
X
accepts/stores/calls methods on/returns types defined packageY
, but doesn't actually accessY
's (non-method) functions or variables directly,X
can use an interface that the type inY
satisfies rather than actually importingY
.avoiding dependencies with interfaces in general, you can see how, say, the
io
module doesn't depend onos
for the File class even though its functions can work onFiles
. (It just definesio.Writer
, etc., and*os.File
satisfies those interfaces.)
For instance, io
accepts a 'Writer' in its Copy()
function (which can be a File or another else knowing how to write), and ignores completely os
(.File)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With