欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 使用go語言實現查找兩個數組的異同操作

使用go語言實現查找兩個數組的異同操作

熱門標簽:赤峰電銷 官渡電銷外呼管理系統怎么收費 400開頭電話怎樣申請 杭州人工智能電銷機器人費用 貴州電話智能外呼系統 江蘇呼叫中心外呼系統有效果嗎 地圖區域圖標注后導出 利用地圖標注位置 谷歌美發店地圖標注

最近項目上碰到個小需求,輸入是兩個數組,一個舊數組一個新數組,要求獲取新數組相對舊數組所有新增和刪除的元素,例如:

輸入:

arr_old: {"1", "2", "4", "5", "7", "9"}

arr_new: {"2", "3", "4", "6", "7"}

返回:

arr_added: {"3", "6"}

arr_deleted: {"1", "5", "9"}

go的標準庫中沒有類似的直接比較的方法,需要自己具體實現,最簡單的方法當然是舊數組的每個元素去新數組,找不到的就是刪除的,然后新數組的元素再挨個去舊數組找一遍,找不到就是新增的,但這個方法效率實在太低了。

這里我使用了一種基于集合運算的思想,即分別求兩個數組的交集和并集,并集減去交集就是所有發生變化的元素(要么是新增的,要么是刪除的),遍歷這個集合中的元素去舊數組中查找,如果在舊數組中找到,那么就是刪除掉的元素;反之,如果找不到,則一定能在新數組中找到(用不著真的再去遍歷一次),那么就是新增的元素。

上代碼,這里有個技巧,就是利用go中map鍵唯一性的特性,用數組的元素作為map的key,通過map來實現快速查找。

package main
import (
 "fmt"
)
func main() {
 //fmt.Println("Hello World!")
 src := []string{"1", "2", "4", "5", "7", "9"}
 dest := []string{"2", "3", "4", "6", "7"}
 added, removed := Arrcmp(src, dest)
 fmt.Printf("add: %v\nrem: %v\n", added, removed)
}
func Arrcmp(src []string, dest []string) ([]string, []string) {
 msrc := make(map[string]byte) //按源數組建索引
 mall := make(map[string]byte) //源+目所有元素建索引
 var set []string //交集
 //1.源數組建立map
 for _, v := range src {
 msrc[v] = 0
 mall[v] = 0
 }
 //2.目數組中,存不進去,即重復元素,所有存不進去的集合就是并集
 for _, v := range dest {
 l := len(mall)
 mall[v] = 1
 if l != len(mall) { //長度變化,即可以存
 l = len(mall)
 } else { //存不了,進并集
 set = append(set, v)
 }
 }
 //3.遍歷交集,在并集中找,找到就從并集中刪,刪完后就是補集(即并-交=所有變化的元素)
 for _, v := range set {
 delete(mall, v)
 }
 //4.此時,mall是補集,所有元素去源中找,找到就是刪除的,找不到的必定能在目數組中找到,即新加的
 var added, deleted []string
 for v, _ := range mall {
 _, exist := msrc[v]
 if exist {
 deleted = append(deleted, v)
 } else {
 added = append(added, v)
 }
 }
 return added, deleted
}

運行結果:

add: [6 3]

rem: [1 5 9]

歡迎大家交流效率更高的方法。

補充:go語言教程之淺談數組和切片的異同

本期的分享我們來講解一下關于go語言的數組和切片的概念、用法和區別。

在go語言的程序開發過程中,我們避免不了數組和切片。關于他們的用法和區別卻使得有的小伙伴感覺困惑。所以小棧君這里也歸納和總結了關于數組和切片的干貨幫助小伙伴進行理解。

數組的定義

數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,這種類型可以是任意的原始類型例如整形、字符串或者自定義類型。

相對于去聲明 number0, number1, ..., number99 的變量,使用數組形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于擴展。

數組元素可以通過索引(位置)來讀取(或者修改),索引從 0 開始,第一個元素索引為 0,第二個索引為 1,以此類推。

總體來講的話數組就是同一種類型的固定長度的序列。

在go語言中數組的定義是很簡單的。

如圖所示,我們定義了一個長度為2的數組,在數組定義的過程中,系統已經對這個數組進行了初始化并分配了空間。所以我們如果想要進行賦值可以通過數組名加上下標的方式進行賦值。但是值得注意的一點是我們并不能進行數組的超長處理。這一點有別于java的數組定義,java的定長數組添加值后如果對于超出的值會有自動擴容功能。

但是在go語言中并沒有方法來進行增刪改查值,只有通過下標的方式,所以我們如果進行了越界處理編譯都會進行報錯。所以才入門的小伙伴們需要注意一下哦。數組的下標在數組的合法范圍之外就會出發訪問越界,會有panic出現。所以小棧君也是通過了一個實例給大家說明一下,因為編譯可能會不通過,所以我們巧妙的避開編譯器的編譯進行數組的越界操作說明。

當然需要值得注意的一點是,數組的長度也是數組類型的一部分,因此var a [2]int 和 var b [3] int 是兩個不同的類型。

知識點來了,在go語言中的數組是屬于值類型傳遞,當我們傳遞一個數組到一個方法中,改變副本的值并不會修改到原本數組的值。所以得到的數組還是原來的樣子。

因此如果我們要對數組進行值的修改的話,就只有進行指針操作啦~。

切片的概念

在go語言中數組中長度不可以更改,所以在實際的應用環境中并不是非常實用,所以Go語言衍生出了一種靈活性強和功能更強大的內置類型,即為切片。

與上面所講的數組相比,切片的長度是不固定的,并且切片是可以進行擴容。切片對象非常小,是因為它是只有3個字段的數據結構:一個是指向底層數組的指針,一個是切片的長度,一個是切片的容量。這3個字段,就是Go語言操作底層數組的元數據,有了它們,我們就可以任意的操作切片了。

當然,切片作為數組的引用,所以切片屬于是引用類型,各位小伙伴可千萬要記住了哦。在切片的使用過程當中,我們可以通過遍歷數組的方式進行對于切片的遍歷,我們也可以內置方法len對數組或切片進行長度的計算。

當然我們也可以對切片的容量進行計算,之前有講過Go語言有豐富的內置庫提供給我們使用,所以我們也可以cap內置函數進行容量的計算。多個切片如果表示同一個數組的片段,它們可以共享數據;因此一個切片和相關數組的其他切片是共享存儲的,相反,不同的數組總是代表不同的存儲。數組實際上是切片的構建塊。

上面的例子小棧君分別用數組和切片進行了測試,我們可以看到數組的容量一旦確定后就無法進行更改,當我們的切片進行初始化,初始的容量是2,此時切片的容量和長度都是2,但是我通過內置的append方法進行了切片的增加。此時的切片的容量和長度都是4。此時我們并不能確定切片內置擴容的機制,但是隱約猜測是倍增。

言歸正傳,為了測試一下切片的擴容機制,所以小棧君又進行了切片的增加,此時,細心的小伙伴應該發現,這次小棧君一次性增加了兩個元素在一個append里面,因為這是append方法是一個可變長度的傳值。這也是一個小知識點哦。

如果切片的底層數組,沒有足夠的容量時,就會新建一個底層數組,把原來數組的值復制到新底層數組里,再追加新值,這時候就不會影響原來的底層數組了。

append目前的算法是:容量小于1000個時,總是成倍的增長,一旦容量超過1000個,增長因子設為1.25,也就是說每次會增加25%的容量。

之后我們發現切片的容量和長度發生了變化,如果說上次容量的擴張是4是我們猜測的倍數擴容方式,那么這次我們就實錘了他的擴容機制就是倍增。而且在Go語言的容量和長度不一樣,所以我們也可以得出結論,就是在 0 = len(arry) = cap(slice)。

在我們聲明好切片后我們可以使用new或是make方法對切片進行初始化,當然小棧君也試著嘗試證明切片如果沒有進行初始化是會panic的。結果并沒有出現。因為如果slice沒有初始化,它僅僅相當于一個nil,長度和容量都為0,并不會panic。

小棧君也考慮到可能是因為沒有內置增加方法或是沒有報錯僅僅只是因為我后面利用對Carry數組的切割進行賦值的緣故。所以不甘心又做了一次嘗試,定義好相應的切片后直接使用append方法,結果如下:

我們同樣可以通過上述的例子了解到切片的下標是左閉右開區間,因為我們carry數組的內容如上圖所示, 我們最終得到的結果是IT干貨棧,下標來講的話是屬于1。所以我們得到的結論和事實是一樣的。對于切片我們也有很多用法,如下圖所示:

下圖是Python中對于切片的操作,并且Python中的數組更為靈活,在后面我為大家分享Python教程的時候會詳細分享哦。

切片的初始化

對于切片的初始化我們可以make方法和new方法

new(T) 為每個新的類型T分配一片內存,初始化為 0 并且返回類型為*T的內存地址:這種方法 返回一個指向類型為 T,值為 0 的地址的指針,它適用于值類型如數組和結構體;它相當于 T{}。

make(T) 返回一個類型為 T 的初始值,它只適用于3種內建的引用類型:切片、map 和 channel。

拷貝

因為在go語言的數組是屬于值傳遞,之前的方法也證實了這一點,在方法傳遞值的時候系統會進行拷貝一份副本進行傳遞,如果需要改變的值的話就需要使用指針。但是在使用切片處理的時候,因為切片屬于引用傳遞,所以go語言有內置的函數copy方法進行值的拷貝。

上述的一個例子可以綜合說明幾點問題了,最開始我們定義了一個切片并且容量是2,內容是1和2,我們同樣定義了切片b但是并沒有做初始化處理。直接使用copy操作。使用copy操作的時候,小棧君也復制了源碼出來,第一個是我們的數據源,第二個參數傳遞我們的目標源。直接使用的話我們可以從結果看出并沒有成功。

所以接下來小棧君又進行了初始化操作。這里舉例的目的是提醒各位,在操作切片的時候沒有初始化就相當于nil,最好是進行切片的初始化操作。在早期go語言的版本中,沒有初始化切片會直接報錯。接下來我又進行了再一次的復制操作并且打印出他們的地址和容量、長度。可以看出進行切片的拷貝是不會進行切片的擴容處理。而且他們分別指向了不同的地址說明拷貝成功。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 淺談Go語言中字符串和數組
  • 簡單談談Golang中的字符串與字節數組
  • go特性之數組與切片的問題
  • 詳解go 動態數組 二維動態數組
  • go for range遍歷二維數組的示例

標簽:宜春 鷹潭 保定 河池 黔西 泰安 松原 武漢

巨人網絡通訊聲明:本文標題《使用go語言實現查找兩個數組的異同操作》,本文關鍵詞  使用,語言,實現,查找,兩個,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用go語言實現查找兩個數組的異同操作》相關的同類信息!
  • 本頁收集關于使用go語言實現查找兩個數組的異同操作的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲美女一区二区三区| av一区二区三区| 手机在线看片日韩| 91福利资源站| 亚洲视频一区在线| 成人国产在线观看| 久久精品黄色片| 国产精品久久久久影院色老大| 国产精品免费aⅴ片在线观看| 久久99这里只有精品| 人人妻人人澡人人爽人人精品| 欧美日本韩国一区| 亚洲电影在线免费观看| 日批免费观看视频| 制服丝袜日韩国产| 日韩不卡手机在线v区| 加勒比精品视频| 日韩一区二区视频| 蜜桃免费网站一区二区三区| 亚洲人成人无码网www国产| 欧美sm美女调教| 韩国中文字幕2020精品| 香蕉久久久久久久| 日本一区二区电影| 成人av免费在线播放| 日本韩国精品一区二区在线观看| 中文字幕一区二区日韩精品绯色| av高清不卡在线| 欧美性淫爽ww久久久久无| 一区二区三区小说| 污污污www精品国产网站| 欧美一级二级三级蜜桃| 久久精品国产澳门| 国产又色又爽又高潮免费| 久久久九九九九| 国产iv一区二区三区| 色综合久久88色综合天天免费| 亚洲精品免费一二三区| 中文在线观看免费视频| 欧美va在线播放| 国产成人亚洲综合a∨婷婷| 色噜噜狠狠成人中文综合| 亚洲综合丁香婷婷六月香| 最新在线黄色网址| 久久亚洲一区二区三区四区| 成人小视频在线| 欧美色老头old∨ideo| 日本成人在线视频网站| 国产精品一区二区亚洲| 亚洲免费三区一区二区| 黄色污在线观看| 国产亚洲美州欧州综合国| aaa亚洲精品| 欧美一区二区国产| 国产成人精品www牛牛影视| 在线亚洲+欧美+日本专区| 日本怡春院一区二区| 国产又粗又猛又爽又黄的视频小说| 亚洲素人一区二区| 黄色网址在线视频| 欧美国产一区在线| 在线精品视频播放| 亚洲国产精品高清| 在线精品视频播放| 国产精品美女久久久久久久网站| 中文字幕人妻一区| 欧美国产丝袜视频| 51调教丨国产调教视频| 成人免费在线播放视频| 最新中文字幕视频| 亚洲欧洲制服丝袜| 欧洲av一区二区三区| 亚洲老妇xxxxxx| 美国黑人一级大黄| 亚洲国产一区二区a毛片| 天天操天天摸天天舔| 午夜精品福利一区二区蜜股av | 在线观看网站黄| 久久久久久亚洲综合| 91亚洲一线产区二线产区| 欧美国产综合一区二区| avtt香蕉久久| 亚洲欧美激情在线| 香蕉久久久久久久| 三级在线观看一区二区| 国产精品老熟女一区二区| 久久成人精品无人区| 欧美日韩和欧美的一区二区| 国产v日产∨综合v精品视频| 日韩精品在线一区| 老女人性生活视频| 国产精品护士白丝一区av| 中国毛片在线观看| 亚洲成人资源网| 色视频成人在线观看免| 国产精品羞羞答答xxdd| 精品裸体舞一区二区三区| 伊人av在线播放| 亚洲欧洲另类国产综合| 刘亦菲国产毛片bd| 日韩国产欧美在线播放| 欧美日韩一区久久| www.爱久久.com| 日本一区二区视频在线| 男生草女生视频| 亚洲国产婷婷综合在线精品| 欧美自拍偷拍一区| 成人av在线看| 国产精品情趣视频| 男女全黄做爰文章| 国内成人自拍视频| 日韩精品中文字幕一区二区三区| 国产 xxxx| 亚洲超丰满肉感bbw| 欧美视频在线不卡| av不卡一区二区三区| 综合分类小说区另类春色亚洲小说欧美| 日本女人性生活视频| 国产一区二区三区在线看麻豆| 精品蜜桃在线看| 麻豆精品免费视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产一区二区三区观看| 欧美电视剧免费观看| 黄色国产在线观看| 日韩国产成人精品| 91精品蜜臀在线一区尤物| 制服丝袜在线第一页| 暗呦丨小u女国产精品| 五月综合激情日本mⅴ| 精品久久久影院| 欧美日韩中文字幕精品| 精品一区二区久久久| 久久麻豆一区二区| 一二三四国产精品| 国产成人精品免费视频网站| 中文字幕不卡三区| 欧美又粗又大又长| 91网址在线看| 亚洲成人动漫一区| 欧美一区中文字幕| 91视频免费观看网站| 国产剧情一区二区| 中文字幕亚洲欧美在线不卡| 一本一道综合狠狠老| 欧美熟妇另类久久久久久多毛| 一区二区三区在线免费播放| 欧美日韩国产高清一区二区三区 | 成年人在线观看av| 精品国产一区久久| 欧美性大战xxxxx久久久| 91精品国产欧美日韩| 国产激情第一页| 蜜桃av一区二区三区电影| 精品国产电影一区二区| 二区三区四区视频| bt欧美亚洲午夜电影天堂| 依依成人综合视频| 日韩一区二区三区视频| 国产美女永久免费无遮挡| 国产91高潮流白浆在线麻豆| 亚洲欧美一区二区三区极速播放 | 精品一区免费av| 亚洲国产精品av| 欧美亚洲自拍偷拍| 亚洲国产精品无码久久久久高潮 | 日本猛少妇色xxxxx免费网站| 成人一区二区三区视频在线观看 | 极品白嫩的小少妇| 麻豆精品久久久| 国产精品国产三级国产aⅴ中文| 欧美系列一区二区| 亚洲第一成人网站| 成人爽a毛片一区二区免费| 亚洲一二三四区| 亚洲精品在线观看视频| 老女人性淫交视频| 国产精品人人做人人爽人人添| 日本久久一区二区三区| 老熟妇精品一区二区三区| 丁香天五香天堂综合| 亚洲成人综合在线| 国产午夜精品一区二区三区视频| 欧洲精品在线观看| 欧美日韩高清丝袜| jizz一区二区| 免费视频一区二区| 国产精品成人午夜| 欧美一卡二卡三卡| 五月天av网站| 爱爱的免费视频| 99re6这里只有精品视频在线观看| 青青草成人在线观看| 中文字幕五月欧美| 欧美xxxx在线观看| 在线观看一区不卡| 国精产品视频一二二区| 五十路六十路七十路熟婆| 99久久精品费精品国产一区二区| 蜜臀av国产精品久久久久|