[Go]

[Go] import cycle not allowed - 예제

dogfootman 2024. 6. 18. 00:53

개요

import cycle not allowed가 발생하는 경우

+---------------------+       +----------------------+
|      user 패키지    |       |      board 패키지     |
|                     |       |                      |
| +-----------------+ |       | +------------------+ |
| |   User Struct   | |       | |    Post Struct   | |
| +-----------------+ |       | +------------------+ |
|                     |       |                      |
| +-----------------+ |       | +------------------+ |
| | GetFriendList() | <-------+ | GetLastPostByUserID() |
| +-----------------+ |       | +------------------+ |
|                     |       |                      |
| +-----------------+ |       | +------------------+ |
| | GetUserNameByID() +-------> | GetPostList()    | |
| +-----------------+ |       | +------------------+ |
|                     |       |                      |
+---------------------+       +----------------------+

 

  • user패키지에는 친구 리스트를 반환하는 func가 존재하고 <- board패키지로 부터 마지막 작성한 게시글을 취득
  • board패키지에서는 게시판 글 리스트 반환하는 func이 존재 -> user패키지로 부터 유저의 이름을 취득

 

1. 프로젝트 구조

/dependency1
│
├── main.go
├── user
│   └── user.go
└── board
    └── board.go

 

 

 

2. 코드

main.go

package main

import (
	"dependency1/board"
	"dependency1/user"
	"fmt"
)

func main() {
	friendList := user.GetFriendList(1)
	fmt.Println("Friend List:", friendList)

	postList := board.GetPostList()
	fmt.Println("Post List:", postList)
}

 

 

board.go

package board

import (
	"dependency1/user"
)

type Post struct {
	ID      int
	UserID  int
	Title   string
	Content string
}

var posts = []*Post{
	{ID: 1, UserID: 1, Title: "First Post", Content: "This is Alice's first post"},
	{ID: 2, UserID: 2, Title: "Hello World", Content: "This is Bob's first post"},
}

type PostInfo struct {
	*Post
	UserName string
}

func GetPostList() []*PostInfo {

	var postList []*PostInfo
	for _, post := range posts {
		// 각 게시글 작성자의 이름을 가져옴
		userName := user.GetUserNameByID(post.UserID)
		info := &PostInfo{Post: post, UserName: userName}
		postList = append(postList, info)
	}

	return postList
}

func GetLastPostByUserID(userID int) string {
	// 주어진 userID의 마지막 게시글 반환
	for i := len(posts) - 1; i >= 0; i-- {
		if posts[i].UserID == userID {
			return posts[i].Title
		}
	}
	return "No posts found"
}

 

 

user.go

package user

import (
	"dependency1/board"
)

type User struct {
	ID        int
	Name      string
	FriendIDs []int
}

var users = []*User{
	{ID: 1, Name: "Alice", FriendIDs: []int{2}},
	{ID: 2, Name: "Bob", FriendIDs: []int{1}},
}

type FriendInfo struct {
	*User
	LastPost string
}

func GetFriendList(userID int) []*FriendInfo {

	user := GetUserByID(userID)
	if user == nil || len(user.FriendIDs) == 0 {
		return nil
	}

	var infoList []*FriendInfo
	for _, friendID := range user.FriendIDs {
		friendUser := GetUserByID(friendID)
		// 유저의 마지막 글을 취득
		lastPost := board.GetLastPostByUserID(friendUser.ID)
		info := &FriendInfo{User: friendUser, LastPost: lastPost}
		infoList = append(infoList, info)
	}
	return infoList
}

func GetUserByID(userID int) *User {
	for _, user := range users {
		if user.ID == userID {
			return user
		}
	}
	return nil
}

func GetUserNameByID(userID int) string {
	user := GetUserByID(userID)
	if user == nil {
		return ""
	}
	return GetUserByID(userID).Name
}

 

 

 

3. 실행결과

package dependency1
	imports dependency1/board
	imports dependency1/user
	imports dependency1/board: import cycle not allowed

 

import cycle not allowed 에러가 발생하는걸 확인 할 수 있다