需求描述
使用map
和interface{}
实现一个字典,可以存取任意类型的key
和value
声明字典,设计设置值、获取值的函数
/* 声明一个字典结构 */
type Dictionary struct {
// 设置一个map属性,key和value都是interface{}类型
data map[interface{}]interface{}
}
/* 定义该类型的函数 */
func (d *Dictionary) Get(key interface{}) interface{} {
return d.data[key]
}
func (d *Dictionary) Set(key interface{}, value interface{}) {
d.data[key] = value
}
遍历字段的所有键值函数
设置回调函数,回调返回需要遍历的数据。将回调的返回值设置为bool
类型,外部逻辑在回调中不需要遍历时直接返回false
即可终止遍历。
/* 设置回调函数,返回需要遍历的数据 */
// 定义回调,类型为 func(k,v interface{})bool,意思是返回键值数据(k、v)。bool 表示遍历流程控制,返回 true 时继续遍历,返回 false 时终止遍历。
func (d *Dictionary) Visit(callback func(k, v interface{}) bool) {
// 回调函数返回值为空,直接返回
if callback == nil {
return
}
// 循环取值
for k, v := range d.data {
// 根据 callback 的返回值,决定是否继续遍历
if !callback(k, v) {
return
}
}
}
初始化和清除
字典结构包含有map
,需要在创建Dictionary
实例时初始化map
。
NewDictionary
中调用Clear()
方法避免了map
初始化过程的代码重复问题。
/* 清空数据函数 */
func (d *Dictionary) Clear() {
d.data = make(map[interface{}]interface{})
}
/* 创建一个字典 */
func NewDictionary() *Dictionary {
d := &Dictionary{}
// 初始化map-->先清理
d.Clear()
return d
}
使用字典
func main() {
// 创建字典实例
dict := NewDictionary()
// 添加数据
dict.Set("大锤", 80)
dict.Set("小锤", 60)
dict.Set("瞎几把锤", 24)
// 获取值并打印
favorite := dict.Get("小锤")
fmt.Println("价格:", favorite)
// 遍历所有字典元素
dict.Visit(func(key, value interface{}) bool {
// 转换值得类型
if value.(int) > 50 {
// 输出内容
fmt.Println(key, "贵的一批!")
return true
}
// 默认输出
fmt.Println(key, "不是很贵!")
return true
})
}
完整的代码
package main
import "fmt"
/* 声明一个字典结构 */
type Dictionary struct {
// 设置一个map属性,key和value都是interface{}类型
data map[interface{}]interface{}
}
/* 定义该类型的函数 */
func (d *Dictionary) Get(key interface{}) interface{} {
return d.data[key]
}
func (d *Dictionary) Set(key interface{}, value interface{}) {
d.data[key] = value
}
/* 设置回调函数,返回需要遍历的数据 */
// 定义回调,类型为 func(k,v interface{})bool,意思是返回键值数据(k、v)。bool 表示遍历流程控制,返回 true 时继续遍历,返回 false 时终止遍历。
func (d *Dictionary) Visit(callback func(k, v interface{}) bool) {
// 回调函数返回值为空,直接返回
if callback == nil {
return
}
// 循环取值
for k, v := range d.data {
// 根据 callback 的返回值,决定是否继续遍历
if !callback(k, v) {
return
}
}
}
/* 清空数据函数 */
func (d *Dictionary) Clear() {
d.data = make(map[interface{}]interface{})
}
/* 创建一个字典 */
func NewDictionary() *Dictionary {
d := &Dictionary{}
// 初始化map-->先清理
d.Clear()
return d
}
func main() {
// 创建字典实例
dict := NewDictionary()
// 添加数据
dict.Set("大锤", 80)
dict.Set("小锤", 60)
dict.Set("瞎几把锤", 24)
// 获取值并打印
favorite := dict.Get("小锤")
fmt.Println("价格:", favorite)
// 遍历所有字典元素
dict.Visit(func(key, value interface{}) bool {
// 转换值得类型
/*
遍历返回的 key 和 value 的类型都是 interface{},这里确认 value 只有 int 类型,所以将 value 转换为 int 类型判断是否大于 40
*/
if value.(int) > 50 {
// 输出内容
fmt.