新聞中心
go語言操作符 ^ 和 &^
很多語言都是采用 ~ 作為按位取反運(yùn)算符,Go 里面采用的是 ^ 。
創(chuàng)新互聯(lián)專注于恩平網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供恩平營銷型網(wǎng)站建設(shè),恩平網(wǎng)站制作、恩平網(wǎng)頁設(shè)計(jì)、恩平網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造恩平網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供恩平網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
如果作為二元運(yùn)算符,^ 表示按位異或,即:對應(yīng)位相同為 0,相異為 1。
操作符 ^,按位置零,例如:z = x ^ y,表示如果 y 中的 bit 位為 1,則 z 對應(yīng) bit 位為 0,否則 z 對應(yīng) bit 位等于 x 中相應(yīng)的 bit 位的值。
對于有符號的整數(shù)來說,是按照補(bǔ)碼進(jìn)行取反操作的(快速計(jì)算方法:對數(shù) a 取反,結(jié)果為 -(a+1) ),對于無符號整數(shù)來說就是按位取反
計(jì)算過程
以3為例? 3在內(nèi)存中補(bǔ)碼為 0*** 0011
取反? ? ? ? ? ? 1*** 1100
-1操作? ? ? ? ? 1*** 1011
除符號位取反? ? 1*** 0100 結(jié)果為-4
-------------------------------------------
以9為例 9在內(nèi)存中補(bǔ)碼為 0*** 1001
取反? ? ? ? ? ? 1*** 0110
-1操作? ? ? ? ? 1*** 0101
除符號位取反? ? 1*** 1010 結(jié)果為-10
-------------------------------------------
以-5為例 -5在內(nèi)存中為的補(bǔ)碼為 1*** 1011
為什么呢
-5源碼? ? ? ? ? 1*** 0101
除符號取反? ? ? 1*** 1010
+1操作? ? ? ? ? 1*** 1011
-------------------------------------------
那么-5取反怎么算
補(bǔ)碼 1***1011取反為 0***0100
因?yàn)榉栁粸?,所以是正數(shù)了,正數(shù)的補(bǔ)碼反碼源碼都是一個(gè),所以是4
===================================
再看-1
-1源碼? ? ? ? ? 1*** 0001
除符號取反? ? ? 1*** 1110
+1操作? ? ? ? ? 1*** 1111
補(bǔ)碼 1*** 1111 取反為 0*** 0000
因?yàn)榉栁粸?,所以是正數(shù)了,正數(shù)的補(bǔ)碼反碼源碼都是一個(gè),所以是0
go語言取反輸出的例子看這里
037-字典
字典用大括號括起來,里面有一個(gè)個(gè)的項(xiàng)(item鍵值對)。每一個(gè)項(xiàng)由鍵(key)和值(value)構(gòu)成。
字典的鍵必須獨(dú)一無二,值則不必。值可以取任何數(shù)據(jù)類型,但必須是不可變的,例如字符串、數(shù)字、元組、列表等。
豹子頭這個(gè)key出現(xiàn)了兩次,一次是林沖,一次是李逵,字典默認(rèn)保存最后出現(xiàn)的值。因此'豹子頭':'林沖'這一項(xiàng)就沒有保存成功。
key不能為列表:
創(chuàng)建字典的方法有很多,羅列如下:
五種方法創(chuàng)建出來的字典是完全相等的。
訪問字典中的項(xiàng)的方式與訪問序列的時(shí)候類似,只不過訪問序列需要在[]內(nèi)寫上index的值,而訪問字典則需要寫上key。訪問的時(shí)候,如果字典存在這個(gè)鍵值對,則返回值,如果不存在,則報(bào)錯(cuò)。
字典沒有+和*操作,不支持兩個(gè)字典之間的拼接,或者用*重復(fù)創(chuàng)建多個(gè)字典。
fromkeys()方法用于創(chuàng)建并返回一個(gè)新的字典。他有兩個(gè)參數(shù),第一個(gè)是鍵,第二個(gè)是值。值可以為空,為空則返回None.
根據(jù)最后一個(gè)例子可以看出,fromkeys()方法中,value這個(gè)參數(shù)是唯一的,是一個(gè)整體。拿元組當(dāng)seq,可以將元組的每一個(gè)元素都變成字典中的一個(gè)key,但如果拿元組當(dāng)value,只會(huì)將整個(gè)元組當(dāng)成value,并映射到每一個(gè)key里面。不會(huì)去進(jìn)行一個(gè)多對多的映射。
而這個(gè)方法里面那個(gè)原本就存在的字典,其實(shí)沒啥意義。
呵呵,工具人上線。
這個(gè)比較好理解,dict.keys()就是把字典中的keys返回到結(jié)果中。返回的結(jié)果是什么類型呢?dict_keys類型。沒錯(cuò),他就是一個(gè)獨(dú)立的類型。
get()方法提供了更加友好的方式去訪問字典。當(dāng)鍵不存在的時(shí)候,get()方法并不會(huì)報(bào)錯(cuò),只是默默地返回了一個(gè)None。如果你對None過敏,you have allergy about None.那么default參數(shù)可以讓你自定義找不到內(nèi)容時(shí)返回的內(nèi)容。
清空詞典。
注意,請不要使用給原字典重新命名的方式來清空字典。以免產(chǎn)生安全隱患。
使用copy()方法創(chuàng)建一個(gè)原字典的淺拷貝。所謂的淺拷貝,就是在內(nèi)存中新建一個(gè)新的,內(nèi)容一樣的字典。舉例如下:
可以看到,淺拷貝和直接賦值的區(qū)別。看到這里我產(chǎn)生了一個(gè)疑惑:
還記得在clear()方法中的舉例。同樣是b = a,為什么修改的時(shí)候,b跟著a一起改變,而把a(bǔ)重新賦值的時(shí)候,b就不會(huì)跟著一起變呢?我們嘗試著畫一下圖:
pop就是彈出,彈掉的意思。參考彈煙灰的動(dòng)作。
dict.pop(key)就是把字典里指定key所在的item彈出,并返回這個(gè)key對應(yīng)的value。而dict.popitem()則是直接彈出最后一個(gè)item,并返回這個(gè)item。例:
他相當(dāng)于根據(jù)key查找value,如果存在,就返回,如果不存在,就將default存進(jìn)去,如果未定義default,則將None存進(jìn)去。
update()用來更新更新字典,也就是修改和添加item的操作。
然而在另外一個(gè)例子中,卻發(fā)現(xiàn)了問題:
為什么會(huì)出現(xiàn)這樣的情況呢?研究一下報(bào)錯(cuò)提示:expression cannot contain assignment(表達(dá)式不能包含賦值操作)
仔細(xì)研究一下,updata()方法括號當(dāng)中的內(nèi)容,6='VI',有沒有覺得有點(diǎn)眼熟?
沒錯(cuò),它本質(zhì)上是一個(gè)賦值操作。還記得我們最早講到的,變量不能是數(shù)字的要求嗎?
因此,如果使用update()方法來修改或者添加字典的項(xiàng),一定注意,這個(gè)字典的key不能是數(shù)字,否則就會(huì)出現(xiàn)這樣的錯(cuò)誤。
我們之前在講函數(shù)的收集參數(shù)的時(shí)候提到過,定義函數(shù)時(shí),形參如果使用一個(gè)*,那么它表示將參數(shù)打包成一個(gè)元組,使用兩個(gè)*,形參會(huì)被打包成一個(gè)字典。而在實(shí)參中,如果使用一個(gè)*,則元組會(huì)被解包,字典也一樣。
舉例如下:
go語言數(shù)組,切片和字典的區(qū)別和聯(lián)系
、數(shù)組
與其他大多數(shù)語言類似,Go語言的數(shù)組也是一個(gè)元素類型相同的定長的序列。
(1)數(shù)組的創(chuàng)建。
數(shù)組有3種創(chuàng)建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下:
復(fù)制代碼代碼如下:
func test5() {
var iarray1 [5]int32
var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5}
iarray3 := [5]int32{1, 2, 3, 4, 5}
iarray4 := [5]int32{6, 7, 8, 9, 10}
iarray5 := [...]int32{11, 12, 13, 14, 15}
iarray6 := [4][4]int32{{1}, {1, 2}, {1, 2, 3}}
fmt.Println(iarray1)
fmt.Println(iarray2)
fmt.Println(iarray3)
fmt.Println(iarray4)
fmt.Println(iarray5)
fmt.Println(iarray6)
}
結(jié)果:
[0 0 0 0 0]
[1 2 3 4 5]
[1 2 3 4 5]
[6 7 8 9 10]
[11 12 13 14 15]
[[1 0 0 0] [1 2 0 0] [1 2 3 0] [0 0 0 0]]
我們看數(shù)組 iarray1,只聲明,并未賦值,Go語言幫我們自動(dòng)賦值為0。再看 iarray2 和 iarray3 ,我們可以看到,Go語言的聲明,可以表明類型,也可以不表明類型,var iarray3 = [5]int32{1, 2, 3, 4, 5} 也是完全沒問題的。
(2)數(shù)組的容量和長度是一樣的。cap() 函數(shù)和 len() 函數(shù)均輸出數(shù)組的容量(即長度)。如:
復(fù)制代碼代碼如下:
func test6() {
iarray4 := [5]int32{6, 7, 8, 9, 10}
fmt.Println(len(iarray4))
fmt.Println(cap(iarray4))
}
輸出都是5。
(3)使用:
復(fù)制代碼代碼如下:
func test7() {
iarray7 := [5]string{"aaa", `bb`, "可以啦", "叫我說什么好", "()"}
fmt.Println(iarray7)
for i := range iarray7 {
fmt.Println(iarray7[i])
}
}
二、切片
Go語言中,切片是長度可變、容量固定的相同的元素序列。Go語言的切片本質(zhì)是一個(gè)數(shù)組。容量固定是因?yàn)閿?shù)組的長度是固定的,切片的容量即隱藏?cái)?shù)組的長度。長度可變指的是在數(shù)組長度的范圍內(nèi)可變。
(1)切片的創(chuàng)建。
切片的創(chuàng)建有4種方式:
1)make ( []Type ,length, capacity )
2) make ( []Type, length)
3) []Type{}
4) []Type{value1 , value2 , ... , valueN }
從3)、4)可見,創(chuàng)建切片跟創(chuàng)建數(shù)組唯一的區(qū)別在于 Type 前的“ [] ”中是否有數(shù)字,為空,則代表切片,否則則代表數(shù)組。因?yàn)榍衅情L度可變的。如下是創(chuàng)建切片的示例:
復(fù)制代碼代碼如下:
func test8() {
slice1 := make([]int32, 5, 8)
slice2 := make([]int32, 9)
slice3 := []int32{}
slice4 := []int32{1, 2, 3, 4, 5}
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(slice3)
fmt.Println(slice4)
}
輸出為:
[0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[]
[1 2 3 4 5]
如上,創(chuàng)造了4個(gè)切片,3個(gè)空切片,一個(gè)有值的切片。
(2)切片與隱藏?cái)?shù)組:
一個(gè)切片是一個(gè)隱藏?cái)?shù)組的引用,并且對于該切片的切片也引用同一個(gè)數(shù)組。如下示例,創(chuàng)建了一個(gè)切片slice0,并根據(jù)這個(gè)切片創(chuàng)建了2個(gè)切片 slice1 和 slice2:
復(fù)制代碼代碼如下:
func test9() {
slice0 := []string{"a", "b", "c", "d", "e"}
slice1 := slice0[2 : len(slice0)-1]
slice2 := slice0[:3]
fmt.Println(slice0, slice1, slice2)
slice2[2] = "8"
fmt.Println(slice0, slice1, slice2)
}
輸出為:
[a b c d e] [c d] [a b c]
[a b 8 d e] [8 d] [a b 8]
可見,切片slice0 、 slice1 和 slice2是同一個(gè)底層數(shù)組的引用,所以slice2改變了,其他兩個(gè)都會(huì)變。
(3)遍歷、修改切片:
復(fù)制代碼代碼如下:
func test10() {
slice0 := []string{"a", "b", "c", "d", "e"}
fmt.Println("\n~~~~~~元素遍歷~~~~~~")
for _, ele := range slice0 {
fmt.Print(ele, " ")
ele = "7"
}
fmt.Println("\n~~~~~~索引遍歷~~~~~~")
for index := range slice0 {
fmt.Print(slice0[index], " ")
}
fmt.Println("\n~~~~~~元素索引共同使用~~~~~~")
for index, ele := range slice0 {
fmt.Print(ele, slice0[index], " ")
}
fmt.Println("\n~~~~~~修改~~~~~~")
for index := range slice0 {
slice0[index] = "9"
}
fmt.Println(slice0)
}
如上,前三種循環(huán)使用了不同的for range循環(huán),當(dāng)for后面,range前面有2個(gè)元素時(shí),第一個(gè)元素代表索引,第二個(gè)元素代表元素值,使用 “_” 則表示忽略,因?yàn)間o語言中,未使用的值會(huì)導(dǎo)致編譯錯(cuò)誤。
只有一個(gè)元素時(shí),該元素代表索引。
只有用索引才能修改元素。如在第一個(gè)遍歷中,賦值ele為7,結(jié)果沒有作用。因?yàn)樵谠乇闅v中,ele是值傳遞,ele是該切片元素的副本,修改它不會(huì)影響原本值,而在第四個(gè)遍歷——索引遍歷中,修改的是該切片元素引用的值,所以可以修改。
結(jié)果為:
~~~~~~元素遍歷~~~~~~
a b c d e
~~~~~~索引遍歷~~~~~~
a b c d e
~~~~~~元素索引共同使用~~~~~~
aa bb cc dd ee
~~~~~~修改~~~~~~
[9 9 9 9 9]
(4)、追加、復(fù)制切片:
復(fù)制代碼代碼如下:
func test11() {
slice := []int32{}
fmt.Printf("slice的長度為:%d,slice為:%v\n", len(slice), slice)
slice = append(slice, 12, 11, 10, 9)
fmt.Printf("追加后,slice的長度為:%d,slice為:%v\n", len(slice), slice)
slicecp := make([]int32, (len(slice)))
fmt.Printf("slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)
copy(slicecp, slice)
fmt.Printf("復(fù)制賦值后,slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)
}
追加、復(fù)制切片,用的是內(nèi)置函數(shù)append和copy,copy函數(shù)返回的是最后所復(fù)制的元素的數(shù)量。
(5)、內(nèi)置函數(shù)append
內(nèi)置函數(shù)append可以向一個(gè)切片后追加一個(gè)或多個(gè)同類型的其他值。如果追加的元素?cái)?shù)量超過了原切片容量,那么最后返回的是一個(gè)全新數(shù)組中的全新切片。如果沒有超過,那么最后返回的是原數(shù)組中的全新切片。無論如何,append對原切片無任何影響。如下示例:
復(fù)制代碼代碼如下:
func test12() {
slice := []int32{1, 2, 3, 4, 5, 6}
slice2 := slice[:2]
_ = append(slice2, 50, 60, 70, 80, 90)
fmt.Printf("slice為:%v\n", slice)
fmt.Printf("操作的切片:%v\n", slice2)
_ = append(slice2, 50, 60)
fmt.Printf("slice為:%v\n", slice)
fmt.Printf("操作的切片:%v\n", slice2)
}
如上,append方法用了2次,結(jié)果返回的結(jié)果完全不同,原因是第二次append方法追加的元素?cái)?shù)量沒有超過 slice 的容量。而無論怎樣,原切片slice2都無影響。結(jié)果:
slice為:[1 2 3 4 5 6]
操作的切片:[1 2]
slice為:[1 2 50 60 5 6]
操作的切片:[1 2]
分享題目:go語言關(guān)于字典的操作 go的語法知識
文章網(wǎng)址:http://www.ef60e0e.cn/article/dodggde.html