ホームページ > バックエンド開発 > Golang > golang パイプライン実装キュー

golang パイプライン実装キュー

WBOY
リリース: 2023-05-10 09:13:36
オリジナル
524 人が閲覧しました

Go 言語では、チャネルは非常に強力なデータ構造です。コルーチン間の通信や同期に使用できますが、実際の開発では基本的な機能のみを使用することがほとんどです。この記事では、パイプを使用してキューのデータ構造を実装する方法を説明します。

  1. パイプラインの基本概念

パイプラインは Go 言語の同時実行プリミティブであり、コルーチン間のデータ送信と同期に使用されます。これはブロッキング データ送信方法として設計されており、送信および受信操作中に、相手の操作が完了するまで送信コルーチンと受信コルーチンがブロックされてから次の操作に進みます。

Go 言語では、make() 関数を使用してパイプラインを作成できます。パイプラインには、バッファ付きパイプラインとバッファなしパイプラインの 2 種類があります。バッファ付きパイプは一定量のデータを保存できますが、バッファなしパイプは送信と受信を同時に行うことしかできません。

次は、バッファリングされていない文字列型パイプを定義する方法です。

ch := make(chan string)
ログイン後にコピー
  1. キューの基本概念

キュー (キュー) は、共通の先入れ先出し (FIFO) 原則に従ってデータを管理するデータ構造。キューは、キューの一方の端にデータを追加し、もう一方の端にデータを削除できます。挿入操作はエンキューとも呼ばれ、削除操作はデキューとも呼ばれます。

Go 言語では、スライスを使用してキュー データ構造を実装できます。エンキューおよびデキュー操作には、append() 関数とスライスのカット操作を使用できます。

次は、文字列型キューを定義する方法です:

queue := []string{}
ログイン後にコピー
  1. キューのパイプライン実装のアイデア

これで、次のようになります。パイプとキューの基本 概念をある程度理解したので、パイプラインを使用してキューを実装する方法を考え始めることができます。

まず、バッファリングされた文字列タイプのパイプを定義し、コルーチンを使用してこのパイプを継続的にリッスンする必要があります。パイプラインにデータがある場合は、それをキューに追加する必要があります。そうでない場合は、待機し続けます。

2 番目に、エンキューとデキューという 2 つの関数を定義する必要があります。エンキュー関数では、入力文字列をパイプに送信し、リスニング コルーチンがそれをキューに追加するのを待ちます。デキュー関数では、キューの最初の要素をデキューし、その値を返します。キューが空の場合は、空の文字列が返されます。

最後に、実装が正しいかどうかを検証するための簡単なテスト プログラムを作成する必要があります。

以下は実装プロセスの具体的なコードです:

package main

import "fmt"

func main() {
    q := NewQueue()

    q.Enqueue("Hello")
    q.Enqueue("World")
    q.Enqueue("Golang")

    fmt.Println(q.Dequeue())
    fmt.Println(q.Dequeue())
    fmt.Println(q.Dequeue())
}

func NewQueue() *Queue {
    // 创建一个带缓冲的字符串类型管道
    ch := make(chan string, 100)

    // 启动一个协程持续监听管道
    go func() {
        for s := range ch {
            // 将管道中的字符串加入到队列中
            queue = append(queue, s)
        }
    }()

    return &Queue{ch: ch}
}

// 全局队列变量
var queue []string

type Queue struct {
    ch chan string
}

func (q *Queue) Enqueue(s string) {
    q.ch <- s
}

func (q *Queue) Dequeue() string {
    if len(queue) == 0 {
        return ""
    }

    s := queue[0]
    queue = queue[1:]

    return s
}
ログイン後にコピー

上記のコードでは、まずバッファリングされた文字列タイプのパイプを作成し、このパイプをリッスンするコルーチンを開始します。コルーチンでは、パイプ内に文字列がある場合、それをキューに追加します。

NewQueue() 関数では、パイプラインを使用してキューを実装し、キューのポインタを返します。 Enqueue() 関数では、入力文字列をパイプに送信します。 Dequeue() 関数では、キューの最初の要素を削除し、その値を返します。キューが空の場合は、空の文字列が返されます。

最後に、キューの実装が正しいかどうかをテストするための簡単なテスト プログラムを作成しました。

  1. 概要

この記事では、パイプを使用してキュー データ構造を実装する方法を紹介しました。パイプラインを使用すると、キュー関数をより簡潔かつ効率的に実装でき、同時実行パフォーマンスが優れているため、Go 言語開発環境に非常に適しています。この記事が、初心者が Go 言語のパイプラインとキューの概念をより深く理解するのに役立ち、また、実際の開発で遭遇する問題を解決するためのアイデアを提供できれば幸いです。

以上がgolang パイプライン実装キューの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート