Golang 데이터 구조 - 대기 열

2625 단어 Golang대열queue
Golang 데이터 구조 - 대기 열
대열 은 선진 선발 원칙 의 순서에 따라 집합 한다.대기 열의 한 끝 에 요 소 를 넣 고 다른 한 끝 에서 요 소 를 꺼 냅 니 다.대열 응용 은 현실 에서 많은 장면 이 있 는데, 우 리 는 시간 을 초과 한 계산 대열 이나 영화관 의 검표 행렬 을 상상 할 수 있다.
1. 실현
우 리 는 slice 을 대열 의 밑바닥 구조 로 사용 하여 다음 과 같은 방법 을 폭로한다.
  • New()
  • Enqueue()
  • Dequeue()
  • Front()
  • IsEmpty()
  • Size()
  • New 구조 함수 와 유사 하여 내부 절편 을 초기 화 하 는 것 을 책임 집 니 다.우 리 는 일반적인 병렬 안전 한 대기 열 ItemQueue 을 만 들 계획 이다.genny 을 사용 하여 특정 유형 을 생 성하 여 범 형 유형 값 을 봉인 하 는 데이터 구 조 를 만 들 수 있다.genny 소 개 는 윗글 을 참고 할 수 있다.
    ItemQueue.go
    package queue
    
    import (
    	"github.com/cheekybits/genny/generic"
    	"sync"
    )
    
    // Item the type of the queue
    type Item generic.Type
    
    type ItemQueue struct {
    	data [] Item
    	mux sync.RWMutex
    }
    
    func (s *ItemQueue)New() *ItemQueue {
    	s.data = [] Item{}
    	s.mux = sync.RWMutex{}
    	return s
    }
    
    func (s *ItemQueue) Enqueue(item Item) {
    	s.mux.Lock()
    	defer s.mux.Unlock()
    	s.data = append(s.data, item)
    }
    
    func (s *ItemQueue) Dequeue() Item {
    	s.mux.Lock()
    	defer s.mux.Unlock()
    	item := s.data[0]
    	s.data = s.data[1:]
    
    	return item
    }
    
    func (s *ItemQueue) Front() Item {
    	s.mux.RLock()
    	defer s.mux.RUnlock()
    	return s.data[0]
    }
    
    func (s *ItemQueue) IsEmpty() bool {
    	return len(s.data) == 0
    }
    
    func (s *ItemQueue) Size() int {
    	return len(s.data)
    }
    

    2. 테스트
    테스트 코드 는 위의 방법의 사용 을 설명 합 니 다.
    ItemQueue_test.go
    package queue
    
    import (
    	"log"
    	"testing"
    )
    
    var q ItemQueue
    
    func initQueue()  {
    	if q.data == nil {
    		q = ItemQueue{}
    		q.New()
    	}
    }
    
    func TestIQueue_queue(t *testing.T) {
    	initQueue()
    	q.Enqueue(1)
    	q.Enqueue(2)
    	q.Enqueue(3)
    	q.Enqueue(4)
    
    	log.Println("size",q.Size())
    	item := q.Dequeue()
    	log.Println("pop item",item)
    	log.Println("queue front item",q.Front())
    
    	log.Println("size",q.Size())
    	log.Println("isEmpty",q.IsEmpty())
    }
    
    

    출력:
    2020/07/12 10:47:29 size 4
    2020/07/12 10:47:29 pop item 1
    2020/07/12 10:47:29 queue front item 2
    2020/07/12 10:47:29 size 3
    2020/07/12 10:47:29 isEmpty false
    --- PASS: TestIQueue_queue (0.11s)
    PASS
    
    

    3. 구체 적 인 대기 열 데이터 구 조 를 만 듭 니 다.
    다음은 구체 적 인 유형, int 와 string 을 생 성 합 니 다.
    //generate a `IntQueue` queue of `int` values
    genny -in IQueue.go -out queue-int.go gen "Item=int"
    
    //generate a `StringQueue` queue of `string` values
    genny -in IQueue.go -out queue-string.go gen "Item=string"
    

    4. 총화
    본 고 는 안전 한 범 형 대기 열 데이터 구 조 를 실현 한다.

    좋은 웹페이지 즐겨찾기