ホームページ >バックエンド開発 >Golang >golang は Python 辞書を実装します

golang は Python 辞書を実装します

PHPz
PHPzオリジナル
2023-05-13 10:20:38552ブラウズ

プログラミングにおいて、Python 辞書の使用は最も一般的なデータ構造の 1 つであり、その主な機能はキーを値にマップすることです。 Golang を使用する場合、Golang は静的に型付けされた言語であるため、Python のような辞書型をサポートしません。したがって、一部のシナリオでは、Python 辞書に似たデータ構造を実装する必要があります。この記事では、Golang で Python 辞書を実装する方法を紹介します。

1. Python 辞書の実装

Python では、主にハッシュ テーブルを使用して辞書を実装します。ハッシュテーブルの検索効率はO(1)であり、挿入、削除、検索などの操作が必要な場合、高速にハッシュテーブルを完成させることができます。 Golang では、Python の辞書に似たデータ構造を構造体とマップを通じて実装できます。

  1. 構造に基づいた実装

キーと値のペアのデータ構造を含む構造を定義することで、Python の辞書と同様の機能を実現できます。次に、挿入、削除、検索関数などの対応するメソッドを実装して、辞書操作を完了します。

type Dict struct {
    items map[interface{}]interface{}
}
 
func NewDict() *Dict {
    return &Dict{items: map[interface{}]interface{}{}}
}
 
func (d *Dict) Set(key, value interface{}) {
    d.items[key] = value
}
 
func (d *Dict) Get(key interface{}) (interface{}, bool) {
    value, ok := d.items[key]
    return value, ok
}
 
func (d *Dict) Remove(key interface{}) {
    delete(d.items, key)
}
 
func (d *Dict) Contains(key interface{}) bool {
    _, ok := d.items[key]
    return ok
}
 
func (d *Dict) Len() int {
    return len(d.items)
}

上記のコードでは、構造体 Dict はキーと値のペアのマップを定義し、Set、Get、Remove、Contains、および Len メソッドを実装します。このうち、Set メソッドはキーと値のペアの挿入に使用され、Get メソッドはキーに応じた値の取得に使用され、Remove メソッドはキーと値のペアの削除に使用され、Contains メソッドはキーと値のペアの削除に使用されます。特定のキーが含まれており、Len メソッドを使用して辞書の長さを取得します。

  1. map に基づく実装

map は Golang の組み込み型であり、その最下層もハッシュ テーブルを使用して実装されます。マップ型を利用することでPythonの辞書のような機能も実現できます。

type Dict map[interface{}]interface{}
 
func NewDict() Dict {
    return make(map[interface{}]interface{})
}
 
func (d Dict) Set(key, value interface{}) {
    d[key] = value
}
 
func (d Dict) Get(key interface{}) (interface{}, bool) {
    value, ok := d[key]
    return value, ok
}
 
func (d Dict) Remove(key interface{}) {
    delete(d, key)
}
 
func (d Dict) Contains(key interface{}) bool {
    _, ok := d[key]
    return ok
}
 
func (d Dict) Len() int {
    return len(d)
}

上記のコードでは、map[interface{}]interface{} タイプのエイリアス Dict が定義されており、Set、Get、Remove、Contains、Len メソッドが構造内に実装されています。このうち、Set メソッドはキーと値のペアの挿入に使用され、Get メソッドはキーに応じた値の取得に使用され、Remove メソッドはキーと値のペアの削除に使用され、Contains メソッドはキーと値のペアの削除に使用されます。特定のキーが含まれており、Len メソッドを使用して辞書の長さを取得します。

2. テストコード

次に、実装した辞書に対応する機能があるかを検証するためのテストコードを書いてみましょう。

func TestDict(t *testing.T) {
    // 基于结构体实现字典
    d := NewDict()
    d.Set(1, "hello")
    d.Set("world", "golang")
 
    if v, ok := d.Get(1); !ok || v != "hello" {
        t.Errorf("expect: hello but get: %v", v)
    }
 
    if v, ok := d.Get("world"); !ok || v != "golang" {
        t.Errorf("expect: golang but get: %v", v)
    }
 
    d.Remove("world")
    if d.Contains("world") {
        t.Errorf("should not contain key: world")
    }
 
    if d.Len() != 1 {
        t.Errorf("expect length: 1 but get: %v", d.Len())
    }
 
    // 基于map实现字典
    dict := NewDict()
    dict.Set(1, "hello")
    dict.Set("world", "golang")
 
    if v, ok := dict.Get(1); !ok || v != "hello" {
        t.Errorf("expect: hello but get: %v", v)
    }
 
    if v, ok := dict.Get("world"); !ok || v != "golang" {
        t.Errorf("expect: golang but get: %v", v)
    }
 
    dict.Remove("world")
    if dict.Contains("world") {
        t.Errorf("should not contain key: world")
    }
 
    if dict.Len() != 1 {
        t.Errorf("expect length: 1 but get: %v", dict.Len())
    }
}

テスト コードには、構造とマップの実装に基づく辞書に対応する 2 つの部分が含まれています。まず、キーと値のペアをディクショナリに挿入し、次に値を取得して、値が正しいかどうかを確認します。次に、キーと値のペアを削除し、辞書の長さが変更されたかどうかを確認します。

3. 概要

上記の例を通じて、Golang で構造とマップを使用すると、Python の辞書と同様の機能を実現できることがわかります。実装方法は主に構造ベースとマップベースです。どの実装方法を使用する場合でも、その安定性と効率性を確保するには、ハッシュの競合などの問題に注意を払う必要があります。同時に、これらの基本的なデータ構造を実装することで、その実装原理や使用方法をより深く理解することもできます。

以上がgolang は Python 辞書を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。