首頁 > 後端開發 > Golang > 主體

golang怎麼實作set

PHPz
發布: 2023-04-14 09:18:43
原創
1033 人瀏覽過

Golang是一種靜態類型、高並發、物件導向的程式語言,也是近年來越來越受歡迎的語言之一。在Golang中,雖然不存在Set類型,但我們可以很容易地透過slice和map等基本資料結構實現Set的功能。本文將介紹如何用Golang實作Set。

Set的定義

Set是一種無序且不重複的資料結構,它支援集合的基本操作,包括新增元素、刪除元素、判斷元素是否存在等。在Set中,元素之間沒有先後關係,每個元素是唯一的。

Slice實作Set

Golang中的Slice可以實現Set的功能,因為Slice中的元素是有序的,並且每個元素可以重複出現。我們可以透過自訂方法來實現Slice的去重操作,從而達到Set的目的。

type SetSlice []interface{}

func (s *SetSlice) Add(val interface{}) {
    for _, v := range *s {
        if val == v {
            return
        }
    }
    *s = append(*s, val)
}

func (s *SetSlice) Remove(val interface{}) {
    for i, v := range *s {
        if val == v {
            *s = append((*s)[:i], (*s)[i+1:]...)
            return
        }
    }
}

func (s *SetSlice) Contains(val interface{}) bool {
    for _, v := range *s {
        if val == v {
            return true
        }
    }
    return false
}
登入後複製

在上面的程式碼中,我們自訂了SetSlice類型,並且加入了Add, Remove, Contains等方法。當呼叫Add方法時,我們先透過遍歷Slice來檢查是否存在相同的元素,如果存在則直接返回;否則向Slice中添加元素;刪除元素時,我們透過遍歷Slice來查找待刪除元素並進行刪除操作;判斷元素是否存在時,我們同樣透過遍歷Slice來找元素。

Map實作Set

除了Slice,Golang中的Map也可以實作Set的功能,因為Map中每個key必須是唯一的。我們可以把Map的key當作元素的值,把Map的value設為任意值,不關心具體的值是多少,只要判斷元素是否在Map中出現即可。

type SetMap map[interface{}]struct{}

var exist = struct{}{}

func (s SetMap) Add(val interface{}) {
    s[val] = exist
}

func (s SetMap) Remove(val interface{}) {
    delete(s, val)
}

func (s SetMap) Contains(val interface{}) bool {
    _, c := s[val]
    return c
}
登入後複製

在上面的程式碼中,我們自訂了SetMap類型,並且加入了Add, Remove, Contains等方法。當呼叫Add方法時,我們直接將元素作為Map的key插入Map中,value是一個空的struct{}類型;刪除元素時,我們透過delete函數直接刪除Map中對應的key;判斷元素是否存在時,我們透過存取Map中對應的key來判斷元素是否存在。

總結

在Golang中,雖然不存在Set類型,但我們可以透過slice和map等基本資料結構實現Set的功能。使用slice實作Set需要手動去重,比較費事;使用map實作Set則更簡單有效率。當然,如果我們需要對Set做更複雜的操作,例如取交集、取並集等,建議使用第三方函式庫,例如github.com/deckarep/golang-set,可以大幅提高效率。

以上是golang怎麼實作set的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板