golang实现Python风格字典操作插件库dict的使用

Golang实现Python风格字典操作插件库dict的使用

概述

dict是一个Go语言实现的Python风格字典操作库,它提供了类似Python dict类型的功能,包括键值对存储、有序访问等特性。

安装

使用go get命令安装:

go get github.com/srfrog/dict

然后在代码中导入:

import "github.com/srfrog/dict"

主要特性

  • 可以使用标量、切片、映射、通道和其他字典初始化新字典
  • Go类型int、uint、float、string和fmt.Stringer可作为字典键
  • 如果Go映射键是可哈希的,则直接用作字典键
  • 字典项按插入顺序排序(与Go原生map不同)
  • 内置JSON支持,可进行编组和解组

使用示例

下面是一个完整的示例,展示如何使用dict库:

package main

import (
	"fmt"

	"github.com/srfrog/dict"
)

type Car struct {
	Model, BrandID string
	Recalls        int
}

func main() {
	// 使用map初始化字典
	vins := map[string]*Car{
		"2C3KA43R08H129584": &Car{
			Model:   "2008 CHRYSLER 300",
			BrandID: "ACB9976A-DB5F-4D57-B9A8-9F5C53D87C7C",
			Recalls: 1,
		},
		"1N6AD07U78C416152": &Car{
			Model:   "2008 NISSAN FRONTIER SE-V6 RWD",
			BrandID: "003096EE-C8FC-4C2F-ADEF-406F86C1F70B",
			Recalls: 5,
		},
		"WDDGF8AB8EA940372": &Car{
			Model:   "2014 Mercedes-Benz C300W4",
			BrandID: "57B7B707-4357-4306-9FD6-1EDCA43CF77B",
			Recalls: 4,
		},
	}

	// 创建新字典并用vins map初始化
	d := dict.New(vins)

	// 添加更多VIN
	d.Set("1N4AL2AP4BN404580", &Car{
		Model:   "2011 NISSAN ALTIMA 2.5 S CVT",
		BrandID: "003096EE-C8FC-4C2F-ADEF-406F86C1F70B",
		Recalls: 2,
	})
	d.Set("4T1BE46K48U762452", &Car{
		Model:   "2008 TOYOTA Camry",
		BrandID: "C5764FE4-F1E8-46BE-AFC6-A2FC90110387",
		Recalls: 5,
	})

	// 获取当前总数
	fmt.Println("Total VIN Count:", d.Len())

	// 打印召回次数≥3的VIN
	for item := range d.Items() {
		car, ok := item.Value.(*Car)
		if !ok {
			continue // 不是Car类型
		}
		if car.Recalls < 3 {
			continue // 召回次数不足
		}
		fmt.Println("---")
		fmt.Println("VIN:", item.Key)
	}
}

基本操作

  1. 创建字典

    d := dict.New()  // 创建空字典
    d := dict.New(map[string]int{"a": 1, "b": 2})  // 用map初始化
    
  2. 设置键值

    d.Set("key", "value")
    
  3. 获取值

    value := d.Get("key")
    
  4. 删除键

    d.Del("key")
    
  5. 获取长度

    length := d.Len()
    
  6. 遍历字典

    for item := range d.Items() {
        fmt.Println(item.Key, item.Value)
    }
    

这个库提供了Python风格的字典操作方式,同时保持了Go语言的类型安全和性能特性。


更多关于golang实现Python风格字典操作插件库dict的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Python风格字典操作插件库dict的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 实现 Python 风格字典操作插件库

在 Go 语言中实现类似 Python 字典风格的便捷操作可以大大提高开发效率。下面我将介绍一个简单但功能强大的字典操作库实现。

基本实现

首先我们定义一个 Dict 类型,它本质上是对 map[string]interface{} 的封装:

package dict

import (
	"encoding/json"
	"errors"
	"fmt"
	"reflect"
)

type Dict struct {
	data map[string]interface{}
}

// New 创建一个新的 Dict
func New() *Dict {
	return &Dict{
		data: make(map[string]interface{}),
	}
}

// FromMap 从现有 map 创建 Dict
func FromMap(m map[string]interface{}) *Dict {
	return &Dict{
		data: m,
	}
}

基本操作方法

增删改查

// Set 设置键值对
func (d *Dict) Set(key string, value interface{}) {
	d.data[key] = value
}

// Get 获取值
func (d *Dict) Get(key string) (interface{}, bool) {
	val, ok := d.data[key]
	return val, ok
}

// GetWithDefault 获取值,如果不存在则返回默认值
func (d *Dict) GetWithDefault(key string, defaultValue interface{}) interface{} {
	if val, ok := d.data[key]; ok {
		return val
	}
	return defaultValue
}

// Delete 删除键
func (d *Dict) Delete(key string) {
	delete(d.data, key)
}

// HasKey 检查键是否存在
func (d *Dict) HasKey(key string) bool {
	_, ok := d.data[key]
	return ok
}

字典合并

// Update 合并另一个字典
func (d *Dict) Update(other *Dict) {
	for k, v := range other.data {
		d.data[k] = v
	}
}

// Merge 合并多个字典
func (d *Dict) Merge(dicts ...*Dict) {
	for _, dict := range dicts {
		d.Update(dict)
	}
}

Python 风格方法实现

类似 Python 的 items(), keys(), values()

// Items 返回所有键值对,类似 Python 的 items()
func (d *Dict) Items() []struct {
	Key   string
	Value interface{}
} {
	var items []struct {
		Key   string
		Value interface{}
	}
	for k, v := range d.data {
		items = append(items, struct {
			Key   string
			Value interface{}
		}{k, v})
	}
	return items
}

// Keys 返回所有键,类似 Python 的 keys()
func (d *Dict) Keys() []string {
	keys := make([]string, 0, len(d.data))
	for k := range d.data {
		keys = append(keys, k)
	}
	return keys
}

// Values 返回所有值,类似 Python 的 values()
func (d *Dict) Values() []interface{} {
	values := make([]interface{}, 0, len(d.data))
	for _, v := range d.data {
		values = append(values, v)
	}
	return values
}

字典推导式风格方法

// Map 对字典中的每个键值对执行函数,返回新字典
func (d *Dict) Map(f func(key string, value interface{}) (string, interface{})) *Dict {
	newDict := New()
	for k, v := range d.data {
		newKey, newValue := f(k, v)
		newDict.Set(newKey, newValue)
	}
	return newDict
}

// Filter 过滤字典中的键值对
func (d *Dict) Filter(f func(key string, value interface{}) bool) *Dict {
	newDict := New()
	for k, v := range d.data {
		if f(k, v) {
			newDict.Set(k, v)
		}
	}
	return newDict
}

其他实用方法

JSON 序列化

// ToJSON 将字典转换为 JSON 字符串
func (d *Dict) ToJSON() (string, error) {
	jsonData, err := json.Marshal(d.data)
	if err != nil {
		return "", err
	}
	return string(jsonData), nil
}

// FromJSON 从 JSON 字符串创建字典
func FromJSON(jsonStr string) (*Dict, error) {
	var data map[string]interface{}
	err := json.Unmarshal([]byte(jsonStr), &data)
	if err != nil {
		return nil, err
	}
	return FromMap(data), nil
}

深度复制

// Copy 创建字典的浅拷贝
func (d *Dict) Copy() *Dict {
	newDict := New()
	for k, v := range d.data {
		newDict.Set(k, v)
	}
	return newDict
}

// DeepCopy 创建字典的深拷贝
func (d *Dict) DeepCopy() (*Dict, error) {
	jsonStr, err := d.ToJSON()
	if err != nil {
		return nil, err
	}
	return FromJSON(jsonStr)
}

使用示例

func main() {
	// 创建字典
	d := dict.New()
	d.Set("name", "Alice")
	d.Set("age", 30)
	d.Set("scores", []int{90, 85, 95})

	// 获取值
	if name, ok := d.Get("name"); ok {
		fmt.Println("Name:", name)
	}

	// 使用默认值
	address := d.GetWithDefault("address", "Unknown")
	fmt.Println("Address:", address)

	// 字典推导式
	upperDict := d.Map(func(key string, value interface{}) (string, interface{}) {
		return strings.ToUpper(key), value
	})
	fmt.Println("Upper keys dict:", upperDict.Keys())

	// 过滤
	filtered := d.Filter(func(key string, value interface{}) bool {
		return key != "age"
	})
	fmt.Println("Filtered keys:", filtered.Keys())

	// JSON 序列化
	jsonStr, _ := d.ToJSON()
	fmt.Println("JSON:", jsonStr)
}

扩展功能

如果需要更接近 Python 的使用体验,可以添加以下扩展:

  1. 链式调用:修改方法返回 *Dict 自身
  2. 运算符重载:通过方法模拟运算符行为
  3. 默认值处理:更灵活的默认值机制
  4. 嵌套字典访问:支持 dict.Get("a.b.c") 风格的嵌套访问

这个简单的 Dict 库已经提供了 Python 字典的核心功能,可以根据项目需求进一步扩展。它保持了 Go 语言的类型安全特性,同时提供了类似 Python 的便捷操作方式。

回到顶部