[Go实战]go写一个简单的内存容器 解决表单重复提交等重复问题

61 阅读1分钟
package main

import (
	"fmt"
	"time"
)

func main() {
	t1 := newMemory("dongtech")
	t1.Put("haha")
	t1.Put("lala")
	t1.Put("haha")
	t1.Get()
	t1.Length()
	time.Sleep(time.Second * 4)
	fmt.Println(time.Now().Unix())
	if nil == t1.Get() {
		t1.Put("haha")
	}
	t1.Length()
}

type Memory struct {
	Name  string       //内存容器名
	Items []MemoryItem //多个项
}

type MemoryItem struct {
	Ct   int64       //创建时间
	Et   int64       //过期时间
	Item interface{} //扩展变量
}

func newMemory(name string) *Memory {
	t := &Memory{
		Name: name,
	}
	go func() {
		for {
			t.Repair(time.Now().Unix())
			time.Sleep(time.Second)
		}
	}()
	return t
}

func (p *Memory) Put(newItem interface{}) bool {
	now := time.Now().Unix()
	fmt.Println(now)
	timeQueueItem := MemoryItem{
		Ct:   now,
		Et:   now + 2,
		Item: newItem,
	}
	if len(p.Items) == 0 {
		p.Items = append(p.Items, timeQueueItem)
		return true
	} else {
		for _, item := range p.Items {
			if item.Item == newItem {
				fmt.Println("newItem 存在")
				return true
			}
		}
		p.Items = append(p.Items, timeQueueItem)
		return true
	}
}

func (p *Memory) Delete(newItem interface{}) bool {
	var newItems []MemoryItem
	if len(p.Items) == 0 {
		return true
	} else {
		for _, item := range p.Items {
			if item.Item != newItem {
				newItems = append(newItems, item)
			}
		}
		if len(newItems) > 0 && len(newItems) != len(p.Items) {
			p.Items = newItems
		}
		if len(newItems) == 0 && len(p.Items) == 1 {
			p.Items = newItems
		}
		return true
	}
}

func (p *Memory) Get() interface{} {
	if len(p.Items) == 0 {
		fmt.Println("no records")
		return nil
	} else {
		item := p.Items[0].Item
		p.Delete(item)
		return item
	}
}

func (p *Memory) Length() int {
	fmt.Println(len(p.Items))
	return len(p.Items)
}

func (p *Memory) Repair(time int64) {
	for p.Length() > 0 {
		item := p.Items[0]
		if item.Et > time {
			return
		}
		p.Delete(item.Item)
		fmt.Println("delete后items的长度", p.Length())
	}
}

直接运行就能得到结果,主要是为了表单重复提交等重复问题做的