Golang의 대기열은 무엇입니까?

Golang Ui Daegiyeol Eun Mueos Ibnikka



Go는 효율성, 사용 용이성 및 적응성으로 찬사를 받는 인기 있는 프로그래밍 언어입니다. Go는 풍부한 도구 및 라이브러리 세트를 통해 개발자에게 강력하고 효율적인 소프트웨어 애플리케이션을 구축하는 데 필요한 리소스를 제공합니다. Go에는 없지만 꼬리 표준 라이브러리에서 데이터 구조로 다양한 방법을 사용하여 구현할 수 있습니다. 의 개념에 대해 이야기하겠습니다. 꼬리 이 튜토리얼에서 구현하는 방법.

대기열이란 무엇입니까?

꼬리 미리 결정된 순서로 요소를 저장하고 검색하는 데 사용되는 데이터 구조입니다. 스택과 유사한 선형 데이터 구조이며 FIFO(선입선출) 규칙. 대기자 명단이나 먼저 도착한 사람이 먼저 서비스를 받는 줄에 비유할 수 있습니다. 기존 구성 요소는 전면에서 드롭됩니다. 대기줄 , 새 요소가 뒷면에 추가됩니다.

Golang에서 대기열 구현

구현 대기줄 in Go는 간단하고 효율적이며 다음 네 가지 방법을 사용하여 구현할 수 있습니다.







1: 슬라이스

이동, 일부분 크기가 변경될 수 있는 동적 배열입니다. 구현하려면 대기줄 사용하여 일부분 , 우리는 뒤에 요소를 추가할 수 있습니다 일부분 내장된 추가 기능을 사용하여 앞의 요소를 제거합니다. 일부분 슬라이싱 사용.



이 접근 방식은 구축하기 쉽고 Go의 내장 슬라이스 덕분에 추가 및 슬라이싱 작업에 우수한 성능을 제공합니다. 그러나 새로운 기본 배열에 요소를 복사하는 것을 포함하는 슬라이싱 방법은 다음과 같은 경우 비효율적일 수 있습니다. 대기줄 확장되고 반복되는 대기열 제거 작업이 필요합니다.



다음 코드는 대기줄 Go에서 슬라이스를 사용한 구현.





패키지 메인

수입 'fmt'

기능 메인 ( ) {

대기줄 := 만들다 ( [ ] 상호 작용 { } , 0 )

대기줄 = 추가 ( 대기줄 , '영어' )

대기줄 = 추가 ( 대기줄 , '우르두어' )

대기줄 = 추가 ( 대기줄 , '수학' )

만약에 오직 ( 대기줄 ) > 0 {

안건 := 대기줄 [ 0 ]

대기줄 = 대기줄 [ 1 : ]

fmt. Println ( 안건 )

}

만약에 오직 ( 대기줄 ) == 0 {

fmt. Println ( '대기열이 비어 있습니다' )

} 또 다른 {

fmt. Println ( 대기줄 )

}

}

위의 Go 코드는 슬라이스를 사용하여 간단하게 구성합니다. 대기줄 데이터 구조. 그만큼 추가() 함수는 요소를 큐에 넣는 데 사용됩니다. 대기줄 슬라이스하고 초기 요소를 제거하는 슬라이스 작업을 사용하여 큐에서 빼냅니다. 와 함께 fmt.Println() , 큐에서 빼낸 요소가 인쇄됩니다. 그런 다음 코드는 다음을 사용합니다. 오직() 큐가 비어 있는지 확인하는 함수이며 비어 있으면 ' 대기줄 fmt.Println() 함수를 사용하여 비어 있습니다.

산출



2: 연결 리스트

목록에서 다음 노드에 대한 값과 포인터를 전달하는 노드는 연결 목록을 구성합니다. 하나는 목록의 앞(머리)을 가리키고 다른 하나는 뒤(꼬리)를 가리키는 두 개의 포인터를 사용하여 다음을 구현할 수 있습니다. 대기줄 연결 리스트를 사용합니다. 대기열에서 항목을 제거하는 것(dequeuing)은 목록의 맨 앞에 있는 노드를 제거하는 것과 관련이 있고 대기열에 항목을 추가하는 것(enqueuing)은 목록의 뒤에 새 노드를 추가하는 것을 포함합니다.

이 방법을 사용하면 요소를 복사해야 하는 슬라이스 기반 솔루션과 달리 헤드 및 테일 포인터만 변경하면 되기 때문에 효율적인 큐에 넣기 및 빼기 작업이 가능합니다.

연결 리스트를 사용하여 구현 대기줄 아래 제공된 코드를 사용하여:

패키지 메인

수입 'fmt'

유형 노드 구조체 {

값 인터페이스 { }

다음 * 마디

}

유형 대기열 구조체 {

머리 * 마디

꼬리 * 마디

}

기능 메인 ( ) {

대기줄 := & 대기줄 { 머리 : , 꼬리 : }

새노드 := & 마디 { : '영어' , 다음 : }

대기줄. 꼬리 = 새노드

대기줄. 머리 = 새노드

새노드 = & 마디 { : '우르두어' , 다음 : }

대기줄. 꼬리 . 다음 = 새노드

대기줄. 꼬리 = 새노드

새노드 = & 마디 { : '수학' , 다음 : }

대기줄. 꼬리 . 다음 = 새노드

대기줄. 꼬리 = 새노드

만약에 대기줄. 머리 != {

안건 := 대기줄. 머리 .

대기줄. 머리 = 대기줄. 머리 . 다음

fmt. Println ( 안건 )

}

만약에 대기줄. 머리 == {

fmt. Println ( '대기열이 비어 있습니다.' )

}

}

Node 구조체는 대기열의 각 항목을 나타내며 항목의 값을 저장하는 값 필드와 대기열의 다음 항목을 가리키는 다음 필드의 두 필드를 포함합니다. Queue 구조체는 head 및 tail 속성을 사용하여 각각 대기열의 앞과 뒤를 추적합니다. 그만큼 꼬리의 첫 번째 항목은 head 속성으로 표시되고 마지막 항목은 tail 속성으로 표시됩니다.

헤드 및 테일 매개변수는 처음에 다음으로 설정됩니다. 새로운 때 대기줄 main() 함수에서 설정됩니다. 헤드 및 테일 포인터가 업데이트되어 세 개의 노드를 대기줄 가치와 함께 '영어', '우르두어', 그리고 '수학'. 그만큼 '영어' 항목은 다음 '대기열에서 제거됨' (제거) 전면에서 대기줄 해당 값을 표시하고 헤드 포인터를 다음 노드로 이동하여 대기줄 . dequeuing 후 head가 null이 되면 queue가 비었다는 의미이며 “ 대기줄 is empty”가 인쇄됩니다.

산출

3: 구조

Go에서는 다음과 같은 사용자 지정 데이터 구조를 만들 수 있습니다. 구조체 대표하기 위해 대기줄 . 이것 구조체 저장할 필드를 가질 수 있습니다. 대기줄 항목을 추가 및 제거하는 요소 및 메서드, 대기열이 비어 있는지 확인하고 현재 대기열 크기를 가져옵니다.

생성하는 이 방법 대기줄 in Go는 더 많은 기능으로 확장 및 사용자 정의할 수 있는 사용하기 쉬운 방법으로 편리하고 캡슐화된 구현을 제공합니다. 필요할 때마다 구현을 변경하거나 새로운 기능을 추가할 수 있는 유연한 접근 방식입니다.

맞춤 만들기 구조체 with 메서드는 다른 두 가지 방법에 비해 추가 코드를 작성해야 하므로 복잡성이 증가할 수 있습니다. 그러나 그것은 또한 더 많은 유연성과 제어를 제공합니다 대기줄 .

다음 예는 데이터 구조를 생성하여 대기줄 이동합니다.

패키지 메인

수입 'fmt'

유형 대기열 구조체 {
항목 [ ] 상호 작용 { }
}

기능 ( * 대기줄 ) 대기열에 넣기 ( 항목 인터페이스 { } ) {
큐. 항목 = 추가 ( 큐. 항목 , 안건 )
}

기능 ( * 대기줄 ) 대기열에서 빼기 ( ) 상호 작용 { } {
만약에 오직 ( 큐. 항목 ) == 0 {
반품
}
안건 := 큐. 항목 [ 0 ]
큐. 항목 = 큐. 항목 [ 1 : ]
반품 안건
}

기능 ( * 대기줄 ) 비었다 ( ) 부울 {
반품 오직 ( 큐. 항목 ) == 0
}

기능 ( * 대기줄 ) 크기 ( ) 정수 {
반품 오직 ( 큐. 항목 )
}


기능 메인 ( ) {

대기줄 := & 대기줄 { 항목 : 만들다 ( [ ] 상호 작용 { } , 0 ) }

대기줄. 대기열에 넣기 ( '영어' )
대기줄. 대기열에 넣기 ( '우르두어' )
대기줄. 대기열에 넣기 ( '수학' )

안건 := 대기줄. 대기열에서 빼기 ( )
fmt. Println ( 안건 )
만약에 대기줄. 비었다 ( ) {
fmt. Println ( '대기열이 비어 있습니다' )
}

크기 := 대기줄. 크기 ( )
fmt. Println ( '대기열 크기:' , 크기 )
}

위의 코드에서 항목은 다음을 통해 항목의 슬라이스에 추가됩니다. 대기열에 넣기() 메서드의 끝으로 이동합니다. 대기줄 . 다음에 선입선출(FIFO) 원칙, 대기열에서 빼기() 메서드는 앞쪽에서 항목을 가져옵니다. 대기줄 반환합니다. 항목 슬라이스의 길이는 비었다() 메소드가 대기줄 비었다. 항목 슬라이스의 길이를 반환함으로써 크기() 메서드는 현재를 반환합니다. 꼬리의 크기.

main() 함수는 다음을 사용합니다. 큐 구조체 새로운 것을 만들기 위해 대기줄 , 요소 추가, 항목 제거, 대기줄 비어 있고 크기를 계산합니다.

산출

4: 채널

Go에서는 내장 채널 유형을 사용하여 다음을 구현할 수 있습니다. 대기줄 데이터 구조. 지정된 시간에 대기열에 넣을 수 있는 요소 수를 제한하기 위해 버퍼 크기로 채널을 만들 수 있습니다. 에 요소를 추가하려면 대기줄 , 다음을 사용하여 채널로 보낼 수 있습니다. <- 연산자, 큐에서 요소를 제거하는 동안 동일한 연산자를 사용하여 채널에서 받을 수 있습니다.

이 접근 방식은 동시 액세스가 필요한 상황에서 매우 유용할 수 있습니다. 대기줄 채널은 본질적으로 동시 사용에 안전하기 때문에 필요합니다.

Go 채널이 입력된다는 것을 기억하는 것이 중요합니다. 즉, 채널을 통해 특정 유형의 값만 보낼 수 있고 채널에서 동일한 유형의 값만 받을 수 있습니다.

채널을 사용하여 구성하는 방법에 대한 그림입니다. 대기줄 Go의 데이터 구조.

패키지 메인

수입 (
'fmt'
'시간'
)

유형 대기열 구조체 {
항목 chaninterface { }
}

funcNewQueue ( ) * 대기줄 {


:= & 대기줄 {

항목 : 만들다 ( 찬 인터페이스 { } ) ,
}
q로 이동합니다. 프로세스 항목 ( )
반품
}

기능 ( * 대기줄 ) 프로세스 항목 ( ) {
~을 위한 안건 := 범위 q. 항목 {
만약에 안건 == '영어' {
fmt. Println ( '대기열에서 제거됨:' , 안건 )
}
}
}


기능 ( * 대기줄 ) 대기열에 넣기 ( 항목 인터페이스 { } ) {

큐. 항목 <- 안건

}

펑크메인 ( ) {
대기줄 := NewQueue ( )

대기줄. 대기열에 넣기 ( '영어' )
대기줄. 대기열에 넣기 ( '우르두어' )
대기줄. 대기열에 넣기 ( '수학' )

시간 . ( 2 * 시간 . 두번째 )
}

위의 코드는 큐 구조체 하나의 필드로 항목 의 채널입니다 상호 작용{} 유형. 그만큼 뉴큐() 함수는 새로운 인스턴스를 생성합니다. 대기줄 초기화하고 '아이템' 버퍼링되지 않은 새 채널이 있는 필드. 또한 다음을 사용하여 대기열에 추가된 항목을 처리하기 위해 새로운 고루틴을 시작합니다. 프로세스 항목() 기능. 그만큼 프로세스 항목() 함수는 받은 항목이 다음과 같은지 확인합니다. '영어' 해당 항목에 대해서만 콘솔에 메시지를 인쇄합니다. 그만큼 대기열에 넣기() 함수는 대기열에 새 항목을 추가하는 데 사용됩니다.

산출

결론

큐는 특정 순서로 요소를 저장하고 검색하는 데 사용되는 Go의 필수 데이터 구조입니다. 구현 대기줄 Go는 스레드로부터 안전하므로 프로그램에서 동시성을 구현하는 데 이상적인 선택입니다. 슬라이스, 연결 목록, 구조 및 채널을 사용하여 구현할 수 있습니다. 자세한 내용은 위의 지침에 이미 나와 있습니다.