동도리 개발 로그
Import Cycle error 본문
반응형
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 |