golang container package
container package
golang์๋ ๋นํธ์ธ์ผ๋ก ์ฌ์ฉํ ์ ์๋ container package๊ฐ ์๋ค.
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ผ์ด ๊ฝค ์๊ธด๋ค.
go์์๋ container ํจํค์ง์์ ๊ธฐ๋ณธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์ฃผ๋ฏ๋ก ๊ฝค๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ํจํค์ง์์ ์ ๊ณตํ๋ ์๋ฃ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Linked list
Heap
Ring (Circular list)
container ํจํค์ง๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํด๋ณด์.
container/list
package main
import (
"container/list"
"log"
)
func main() {
lst := list.New()
lst.PushBack(1)
lst.PushBack(2)
lst.PushBack(3)
log.Println(lst.Len())
}
์์ ๊ฐ์ด container/list
ํจํค์ง๋ฅผ importํ๋ฉด, ์์ฝ๊ฒ linked list๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ๋ฐ์ ํ๋ฉด์ linked list๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ๊ฝค๋ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์ ๊ฒ์ด๋ค.
list๋ฅผ ์ํํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค.
package main
import (
"container/list"
"fmt"
"log"
)
func main() {
lst := list.New()
lst.PushBack(1)
lst.PushBack(2)
lst.PushBack(3)
log.Println(lst.Len())
for e := lst.Front(); e != nil; e = e.Next() { // ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋งจ ์๋ถํฐ ๋๊น์ง ์ํ
fmt.Println(e.Value)
}
}
container/heap
๋ค์์ heap ํจํค์ง์ด๋ค. ํ์๋ ์ต๊ทผ ํ์ฌ์์ ์ฒด๊ฒฐ์์ง/์ค๋๋ถ์ ๊ตฌํํ๋ฉด์ min heap๊ณผ max heap์ ๊ตฌํํ ์ผ์ด ์์๋๋ฐ,
container/heap ํจํค์ง๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์๋ค.
heap ํจํค์ง์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ํ์ํ๋ค.
package heap
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
Push(x any)
Pop() any
}
ํ ๋ฒ ๊ตฌํํด์ ์ฌ์ฉํด๋ณด์. ์์ ์์๋ min heap์ ๊ตฌํํด๋ณธ๋ค.
package main
import (
"container/heap"
"log"
)
type IMinHeap interface {
heap.Interface
}
type MinHeap struct {
heap []uint
}
func (m *MinHeap) Len() int {
return len(m.heap)
}
func (m *MinHeap) Less(i, j int) bool {
return m.heap[i] < m.heap[j]
}
func (m *MinHeap) Swap(i, j int) {
m.heap[i], m.heap[j] = m.heap[j], m.heap[i]
}
func (m *MinHeap) Push(x any) {
m.heap = append(m.heap, x.(uint))
}
func (m *MinHeap) Pop() any {
old := m.heap
n := len(old)
element := old[n-1]
m.heap = old[0 : n-1]
return element
}
func main() {
minHeap := &MinHeap{heap: []uint{}}
heap.Init(minHeap)
heap.Push(minHeap, uint(10))
heap.Push(minHeap, uint(20))
heap.Push(minHeap, uint(50))
heap.Push(minHeap, uint(5))
log.Println(heap.Pop(minHeap)) // 5
log.Println(heap.Pop(minHeap)) // 10
log.Println(heap.Pop(minHeap)) // 20
log.Println(heap.Pop(minHeap)) // 50
}
Less ์กฐ๊ฑด์ ๋ถํธ๋ง ๋ฐ๋๋ก ๋ฐ๊ฟ์ค๋ max heap์ผ๋ก ๋ฐ๊พธ์ด ์ฌ์ฉํ ์ ์์ด ํธํ๋ค.
container/ring
๋ค์์ ring์ด๋ค. ring์ ๋น๊ต์ ์ฌ์ฉํ ์ผ์ด ๋ง์ด ์๋ ๋ฏ ๋ณด์ด์ง๋ง, ์์๋๋ฉด ๋๋๋ก ๋์์ด ๋ ์๋ ์๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ list๋ฅผ ์ฐ๋ ํธ์ด๊ธด ํ๋ค.
package main
import (
"container/ring"
"fmt"
)
func main() {
data := []string{"Maria", "John", "Andrew", "James"}
r := ring.New(len(data)) // ๋
ธ๋์ ๊ฐ์๋ฅผ ์ง์ ํ์ฌ ๋ง ์์ฑ
for i := 0; i < r.Len(); i++ { // ๋ง ๋
ธ๋ ๊ฐ์๋งํผ ๋ฐ๋ณต
r.Value = data[i] // ๋ง์ ๋
ธ๋์ ๊ฐ ๋ฃ๊ธฐ
r = r.Next() // ๋ค์ ๋
ธ๋๋ก ์ด๋
}
r.Do(func(x interface{}) { // ๋ง์ ๋ชจ๋ ๋
ธ๋ ์ํ
fmt.Println(x)
})
// "Maria"
// "John"
// "Andrew"
// "James"
}
๋ ๊ฐ์ ring์ ์ฐ๊ฒฐํ๋ ๊ฒ๋ ๋ฌผ๋ก ๊ฐ๋ฅํ๋ค.
package main
import (
"container/ring"
"fmt"
)
func main() {
data := []string{"Maria", "John", "Andrew", "James"}
r := ring.New(len(data)) // ๋
ธ๋์ ๊ฐ์๋ฅผ ์ง์ ํ์ฌ ๋ง ์์ฑ
for i := 0; i < r.Len(); i++ { // ๋ง ๋
ธ๋ ๊ฐ์๋งํผ ๋ฐ๋ณต
r.Value = data[i] // ๋ง์ ๋
ธ๋์ ๊ฐ ๋ฃ๊ธฐ
r = r.Next() // ๋ค์ ๋
ธ๋๋ก ์ด๋
}
r.Do(func(x interface{}) { // ๋ง์ ๋ชจ๋ ๋
ธ๋ ์ํ
fmt.Println(x)
})
// "Maria"
// "John"
// "Andrew"
// "James"
newData := []uint{1, 2, 3, 4}
r2 := ring.New(len(newData))
for i := 0; i < r2.Len(); i++ { // ๋ง ๋
ธ๋ ๊ฐ์๋งํผ ๋ฐ๋ณต
r2.Value = newData[i] // ๋ง์ ๋
ธ๋์ ๊ฐ ๋ฃ๊ธฐ
r2 = r2.Next() // ๋ค์ ๋
ธ๋๋ก ์ด๋
}
r3 := r.Link(r2)
r3.Do(func(x interface{}) { // ๋ง์ ๋ชจ๋ ๋
ธ๋ ์ํ
fmt.Println(x)
})
// John
// Andrew
// James
// Maria
// 1
// 2
// 3
// 4
}
Last updated