畫江湖之 Go 學習篇 [go 實現類似 java 的 set] 某個大佬問的問題 自身也補充下基礎

Krisji發表於2019-04-02
package main
//支援任意型別新增
import (
    "fmt"
    "sync"
)

type inter interface{}/定義一個介面

type Set struct {
    m map[inter]bool//定義一個任意型別的map 集合
    sync.RWMutex//定義一個互斥鎖
}
 //定一個方法 返回一個集合
func New() *Set {
    return &Set{
        m: map[inter]bool{},
    }
}
//新增方法
func (s *Set) Add(item inter) {
    s.Lock()//鎖住
    defer s.Unlock()//延遲釋放鎖
    s.m[item] = true
}
//刪除集合
func (s *Set) Remove(item inter) {
    s.Lock()
    s.Unlock()
    delete(s.m, item)
}
//判斷這個集合中有沒有這個元素
func (s *Set) Has(item inter) bool {
    s.RLock()
    defer s.RUnlock()
    _, ok := s.m[item]
    return ok
}
//返回集合的長度
func (s *Set) Len() int {
    return len(s.List())
}
//集合清楚空
func (s *Set) Clear() {
    s.Lock()
    defer s.Unlock()
    s.m = map[inter]bool{}
}
//判斷集合裡面是否有資料
func (s *Set) IsEmpty() bool {
    if s.Len() == 0 {
        return true
    }
    return false
}

func (s *Set) List() []inter {
    s.RLock()
    defer s.RUnlock()
    list := []inter{}//定義一個陣列
    for item := range s.m {
        list = append(list, item)
    }
    return list
}

func main() {
    s := New()
    s.Add(11)
    s.Add("aa")
    for i, k := range s.List() {
        fmt.Println(i, k)
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章