溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Golang怎么使用Map實(shí)現(xiàn)去重與set的功能

發(fā)布時(shí)間:2021-04-30 10:23:47 來源:億速云 閱讀:380 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Golang怎么使用Map實(shí)現(xiàn)去重與set的功能,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

golang的優(yōu)點(diǎn)

golang是一種編譯語言,可以將代碼編譯為機(jī)器代碼,編譯后的二進(jìn)制文件可以直接部署到目標(biāo)機(jī)器而無需額外的依賴,所以golang的性能優(yōu)于其他的解釋性語言,且可以在golang中使用goroutine來實(shí)現(xiàn)并發(fā)性,它提供了一個(gè)非常優(yōu)雅的goroutine調(diào)度程序系統(tǒng),可以很容易地生成數(shù)百萬個(gè)goroutine。

假設(shè)現(xiàn)在有一個(gè)需求

將以下 url 保存起來,要求不重復(fù)

www.baidu.com
www.sina.com.cn
www.hao123.com
www.baidu.com
www.hao123.com

可以利用 map 的 key 唯一性的問題處理

package main 
var set = map[string]bool { 
}
 
func main() {
    ...
    url := xxx
    if set[url] {
        // 表示集合中已經(jīng)存在
        return
    }
 
    set[url] = true           // 否則如果不存在,設(shè)置為true
}

// 完成后,set的所有的key值為不重復(fù)的值

在此之前,需要確定 golang 支持的 map 的 key 數(shù)量

可以手寫暴力寫入測(cè)試

package main 
import (
 "fmt"
)
 
var test = map[int]int { 
}
 
func main() {
 for i := 0; i < 10000000; i++ {        // 測(cè)試對(duì)1000萬key的支持,完美支持
  fmt.Println(i)
  test[i] = i
 }
}

補(bǔ)充:golang map/set類型

map類型

1. 基礎(chǔ)特性

map是一種無序的鍵值對(duì)的集合; 所以可以類似數(shù)組/slice一樣進(jìn)行迭代

map的值可以使內(nèi)建類型, 也可以是struct類型

內(nèi)部使用hash表實(shí)現(xiàn), map的hash表包含了一個(gè)collection of buckets(桶集合)

2. 聲明與初始化

package main
import (
    "fmt"
)
// map[keyType]valueType
func initMap() {
    // 通過make方法創(chuàng)建
    dict := make(map[string]int)
    dict["age"] = 18
    // 直接創(chuàng)建
    dict2 := map[string]string{"name":"xiaoming", "phone":"135xxx"}
    dict2["addr"] = "Guangzhou"
    fmt.Printf("%v\n", dict2)
}
func main() {
    initMap()
}

3. 元素訪問

package main
import (
    "fmt"
)
type Student struct {
    name string
    grade int
}
func useMap() {
    //使用前應(yīng)該先初始化, 否則panic報(bào)錯(cuò)
    // var map1 map[string]string
    // map1["a"] = "b" // will panic
    map1 := make(map[string]Student)
    map1["s1"] = Student{name:"xiaomo", grade:1}
    fmt.Printf("%v\n", map1)
}
func main() {
    useMap()
}

4. 在函數(shù)中傳遞map

在函數(shù)間傳遞map對(duì)象, 是傳遞引用而不是拷貝; 因此在函數(shù)中對(duì)map進(jìn)行了修改, 引用到它的地方也會(huì)相應(yīng)修改

package main
import (
    "fmt"
)
type Student struct {
    name string
    grade int
}
func useMap() {
    map1 := make(map[string]Student)
    map1["s1"] = Student{name:"xiaomo", grade:1}
    // 作為函數(shù)參數(shù)傳遞
    printMap(map1)
}
func printMap(m map[string]Student) {
    fmt.Printf("currentMap: %v\n", m)
}
func main() {
    useMap()
}

Set類型

golang沒有內(nèi)置Set類型, 可以自定義實(shí)現(xiàn)。

關(guān)于“Golang怎么使用Map實(shí)現(xiàn)去重與set的功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI