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)
}
}
基本操作
-
创建字典:
d := dict.New() // 创建空字典 d := dict.New(map[string]int{"a": 1, "b": 2}) // 用map初始化
-
设置键值:
d.Set("key", "value")
-
获取值:
value := d.Get("key")
-
删除键:
d.Del("key")
-
获取长度:
length := d.Len()
-
遍历字典:
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 的使用体验,可以添加以下扩展:
- 链式调用:修改方法返回
*Dict
自身 - 运算符重载:通过方法模拟运算符行为
- 默认值处理:更灵活的默认值机制
- 嵌套字典访问:支持
dict.Get("a.b.c")
风格的嵌套访问
这个简单的 Dict
库已经提供了 Python 字典的核心功能,可以根据项目需求进一步扩展。它保持了 Go 语言的类型安全特性,同时提供了类似 Python 的便捷操作方式。