동도리 개발 로그

Import Cycle error 본문

개발/Golang

Import Cycle error

동돌이 2019. 11. 25. 14:21
반응형

Go에서는 패키지간 상속을 금지 하고있어서 서로 참조 하게되면 에러가 나온다

 

혹시나 A -> B -> C -> A  (-> 는 참조) 와 같이 프로그래밍이 되어있다면... 어휴.... 찾는데 오래걸렸던 기억이

이경우엔 다시 개발하는것을 추천

 

아래의 코드를 보자.

child.go

package child

import  "../parent"

type Child struct {
	parent *parent.Parent
}

func (child *Child) PrintParentMessage() {
	child.parent.PrintMessage()
}

func NewChild(parent *parent.Parent) *Child {
	return &Child{parent: parent }
}

 parent.go

package parent
import (
	"../child"
	"fmt"
)

type Parent struct {
	message string
}

func (parent *Parent) PrintMessage() {
	fmt.Println(parent.message)
}

func (parent *Parent) CreateNewChild() *child.Child {
	return child.NewChild(parent)
}

func NewParent() *Parent {
	return &Parent{message: "Hello World"}
}

main.go

package main


import (
	"./parent"
)

func main() {
	p := parent.NewParent()
	c := p.CreateNewChild()
	c.PrintParentMessage()
}

 

위의 코드를 실행하게되면 

import cycle not allowed... 라는 오류가 나오게된다

 

Impoert cycle 해결 방법!


인터페이스를 사용하여 해결

 

child.go 만 아래와 같이 변경하면 된다.

package child

type IParent interface {
	PrintMessage()
}

type Child struct {
	parent IParent
}

func (child *Child) PrintParentMessage() {
	child.parent.PrintMessage()
}

func NewChild(parent IParent) *Child {
	return &Child{parent: parent }
}

 

위와 같이 바꿈으로써 child는 parent를 import 하지 않게되고 사이클 에러도 나지 않는다

 

해석 :  PrintMessage() 를 갖고 있는 것는 모두 IParent interface이다. 

 

 

반응형

'개발 > Golang' 카테고리의 다른 글

GoLang 사용 법  (0) 2019.11.25
고언어  (0) 2019.11.25