이중 연결 리스트 (list)
Go는 이중 연결 리스트 (Doubly Linked List)를 표준 패키지에서 지원하고 있는데, 이를 사용하기 위해 “container/list”를 import 해서 사용한다.
Go에서 순차적 동적 자료구조로서 슬라이스가 많이 사용되는데, 이중 연결 리스트는 리스트 중간에 요소를 동적으로 추가,삭제하는 일이 빈번한 경우 슬라이스보다 유용할 수 있다.
이중 연결 리스트를 새로 생성하기 위해서는 list.New() 메서드를 사용하면 되는데, 이 메서드는 리스트를 만들고 그 포인터를 리턴한다. 이후 리스트 포인터를 사용하여 새로운 요소를 리스트 맨 뒤에 추가하거나(PushBack) 맨 앞에 추가할 (PushFront) 수 있다. 또한 중간에 요소를 추가하기 위해 InsertBefore() 혹은 InsertAfter()를 호출할 수 있다.
package main import ( "container/list" "fmt" ) func main() { //새 이중 연결 리스트 생성 mylist := list.New() // 리스트 요소 추가 mylist.PushBack("A") mylist.PushBack(100) mylist.PushBack(true) mylist.PushFront("A") // 리스트 Iteration for e := mylist.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } }
여기서 한가지 주목할 것은 리스트 요소(Element)에는 모든 타입의 데이타를 혼용하여 넣을 수 있다는 점이다. 즉, 위의 예제에서 문자열 A/B, 숫자 100, 부울린 true 등 다양한 타입의 데이타를 리스트 요소에 추가할 수 있었다. 이는 리스트 요소인 Element.Value 타입이 모든 타입을 사용할 수 있는 interface{}으로 정의되어 있기 때문인데, 따라서 list는 strongly typed 컨테이너라 볼 수 없다.