版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第go語(yǔ)言中基本數(shù)據(jù)類(lèi)型及應(yīng)用快速了解目錄整數(shù)特殊的整數(shù)類(lèi)型如果想確定int和uint的大小溢出浮點(diǎn)數(shù)復(fù)數(shù)布爾值字符串字符串的長(zhǎng)度與遍歷字符串的做法字符串的長(zhǎng)度遍歷字符串Rune與Byte(字節(jié))字符串與字節(jié)slice的轉(zhuǎn)換字符串不可變基本類(lèi)型的值都是可比較的數(shù)值的類(lèi)型轉(zhuǎn)換運(yùn)算符常量
整數(shù)
按位長(zhǎng)度分度分為:8位,16位,32位,64位。
對(duì)應(yīng)有符號(hào)整數(shù):int8,int16,int32,int64。
對(duì)應(yīng)無(wú)符號(hào)整數(shù):uint8,uint16,uint32,uint64。
計(jì)算最大數(shù)和最小數(shù)規(guī)則:
有符號(hào)整數(shù):由于有符號(hào),因此位數(shù)的最高位被用來(lái)存儲(chǔ)符號(hào),其他為存儲(chǔ)數(shù)據(jù)值,所以對(duì)于n位數(shù)來(lái)說(shuō),取值范圍是:-2^(n-1)^~2^(n-1)^-1,對(duì)應(yīng)int8來(lái)說(shuō),就是-127~127。無(wú)符號(hào)正數(shù):不需要用最高位記錄符號(hào),全部位數(shù)表示數(shù)字。取值范圍是:0~2^n^-1。對(duì)于int8來(lái)說(shuō),就是0~255。
特殊的整數(shù)類(lèi)型
int和uint以及uintptr。
int和uint根據(jù)特定的平臺(tái),其大小與原生的整數(shù)相同或者是該平臺(tái)上運(yùn)算效率最高的值。要么同時(shí)是64位,要么同時(shí)是32位,但也不能假定他們就是64位或者32位的整型。即使在一樣的硬件下,不同編譯器也有可能選用不同的大小。
至于uintptr,它的大小并不明確。但它肯定足夠容納一個(gè)指針的大小。常用于底層編程。
雖然int、uint的長(zhǎng)度可能與int32、int64、..其他整型相同但是他們是不同的類(lèi)型。
如果想確定int和uint的大小
fmt.Println(runtime.GOARCH)//看看CPU型號(hào)
fmt.Println(strconv.IntSize)//這才是int的大小,上面只是提供一個(gè)對(duì)照
溢出
不論是有符號(hào)數(shù)還是無(wú)符號(hào)數(shù),若計(jì)算結(jié)果所需的位超出類(lèi)型的范圍,就稱(chēng)為溢出。溢出的高位會(huì)被無(wú)提示地拋棄。
variint8=-128
fmt.Println(i-1)//127
vari2int8=127
fmt.Println(i2+1)//-128
varuuint8=0
fmt.Println(u-1)//255
varu2uint8=255
fmt.Println(u2+1)//0
浮點(diǎn)數(shù)
float32、float64。遵循IEEE754標(biāo)準(zhǔn)。
math.MaxFloat32給出了float32類(lèi)型的最大值:3.4028234663852886e+38。
math.MaxFloat64則是float64類(lèi)型的最大值:1.7976931348623157e+308。
浮點(diǎn)數(shù)可以用來(lái)表示小數(shù)。
十進(jìn)制下,float32有效位大約是6位。float64有效位大約是15位。
浮點(diǎn)數(shù)的打印可以使用:
%g,保留足夠的精度顯示%e,使用指數(shù)形式顯示%f,使用無(wú)指數(shù)形式顯示
f:=2.71828
fmt.Printf("%g,%[1]e,%[1]f\n",f)//2.71828,2.718280e+00,2.718280
復(fù)數(shù)
complex64、complex128,二者分別由float32和float64組成。
使用real函數(shù)提取復(fù)數(shù)的實(shí)部,使用imag函數(shù)提取復(fù)數(shù)的虛部。
浮點(diǎn)數(shù)或者整數(shù)后面加i就會(huì)變成一個(gè)虛數(shù),且它的實(shí)部為0。
x:=1+2i
y:=3+4i
布爾值
bool類(lèi)型就是布爾值,有true(真)和false(假)兩個(gè)值。
布爾值無(wú)法隱式轉(zhuǎn)換成數(shù)值,數(shù)值也不能轉(zhuǎn)成布爾值。
它的零值是false。
一元操作符!表示邏輯取反。!true表示false。
字符串
string表示字符串。它是不可變的字節(jié)序列。Go中的字符串內(nèi)部實(shí)現(xiàn)用UTF-8編碼。
字符串的長(zhǎng)度與遍歷字符串的做法
字符串的長(zhǎng)度
對(duì)字符串調(diào)用len函數(shù),獲取到的不是字符串的長(zhǎng)度(字符的個(gè)數(shù)),而是字符串的字節(jié)數(shù)(字節(jié)切片的長(zhǎng)度)。
如下,盡管字符個(gè)數(shù)只有6,但字節(jié)長(zhǎng)度len(s)卻有18,這是因?yàn)橹形淖址訳TF-8存儲(chǔ),通常包含3~4個(gè)字節(jié)。
s:="中文字節(jié)數(shù)多"
fmt.Println("len:",len(s))//len:18
對(duì)字符串使用下標(biāo)索引操作,會(huì)返回對(duì)應(yīng)索引的字節(jié),而不是字符。
s:="中文字節(jié)數(shù)多"
fmt.Println("len:",len(s))//len:18
fori:=0;ilen(s);i++{
fmt.Printf("%d,%[1]c,%[1]T\n",s[i])
對(duì)應(yīng)的輸出如下:
len:18
228,,uint8
184,,uint8
173,,uint8
230,,uint8
150,?,uint8
135,?,uint8
229,,uint8
173,,uint8
151,?,uint8
232,,uint8
138,?,uint8
130,?,uint8
230,,uint8
149,?,uint8
176,,uint8
229,,uint8
164,,uint8
154,?,uint8
因此不要隨便亂用字符串的下標(biāo)操作,否則可能獲得有意想不到的結(jié)果。
遍歷字符串
由上面的下標(biāo)操作可以看出,對(duì)字符串的下標(biāo)索引操作會(huì)獲得單個(gè)字節(jié)而不是字符,假如現(xiàn)在我們想處理的是UTF-8解碼的字符的話,有兩種方式,基本思路都是處理成rune類(lèi)型:
第一種,用UTF-8解碼器顯式處理這些字符,unicode/utf8包示例。
utf8.RuneCountInString(s)返回字符串轉(zhuǎn)為rune后的個(gè)數(shù),Go使用rune代表一個(gè)UTF-8字符。
utf8.utf8.DecodeRuneInString(s[i:])處理當(dāng)前字符串,并算出下一個(gè)rune以及它所占的字節(jié)數(shù)。
s:="What中文字節(jié)數(shù)多"
runeCount:=utf8.RuneCountInString(s)
fmt.Println("runeCount:",runeCount)//runeCount:12
fori:=0;ilen(s);{
r,size:=utf8.DecodeRuneInString(s[i:])
fmt.Printf("i:%d,r:%q,type:%T\n",i,r,r)
i+=size
輸出如下:
runeCount:12
i:0,r:W,type:int32
i:1,r:h,type:int32
i:2,r:a,type:int32
i:3,r:t,type:int32
i:4,r:,type:int32
i:5,r:,type:int32
i:6,r:中,type:int32
i:9,r:文,type:int32
i:12,r:字,type:int32
i:15,r:節(jié),type:int32
i:18,r:數(shù),type:int32
i:21,r:多,type:int32
第二種,用range循環(huán),Go會(huì)隱式的進(jìn)行UTF-8解碼。
注意,這里的i,指的是字節(jié)的下標(biāo),而不是字符的下標(biāo)。
s:="What中文字節(jié)數(shù)多"
fori,r:=ranges{
fmt.Printf("i:%d,rune:%q,type:%T\n",i,r,r)
輸出如下:
i:0,rune:W,type:int32
i:1,rune:h,type:int32
i:2,rune:a,type:int32
i:3,rune:t,type:int32
i:4,rune:,type:int32
i:5,rune:,type:int32
i:6,rune:中,type:int32
i:9,rune:文,type:int32
i:12,rune:字,type:int32
i:15,rune:節(jié),type:int32
i:18,rune:數(shù),type:int32
i:21,rune:多,type:int32
Rune與Byte(字節(jié))
int32的別名是rune,天然適合存儲(chǔ)單個(gè)文字符號(hào),為Go所采用的。
rune類(lèi)型值代表一個(gè)UTF-8字符。以字節(jié)(byte)為單位對(duì)Unicode碼點(diǎn)作變長(zhǎng)編碼?,F(xiàn)在計(jì)算機(jī)都用UTF-8來(lái)表示單個(gè)字符。
字符串的是由字符組成的,字符用單引號(hào)包裹起來(lái),如:
varb='h'
c:='沖'
fmt.Printf("%d,%q\n",b,b)//104,'h'
fmt.Printf("%d,%q\n",c,c)//20914,'沖'
字節(jié),byte類(lèi)型,底層類(lèi)型是uint8,由8個(gè)bit組成,它可以代表一個(gè)ASCII碼。ASCII碼是滿(mǎn)足早期計(jì)算機(jī)的使用的,它用7位表示128個(gè)字符(ASCII字符):大小寫(xiě)英文字母、數(shù)字、標(biāo)點(diǎn)符號(hào)和設(shè)備控制符。
字符串與字節(jié)slice的轉(zhuǎn)換
字符串底層是一個(gè)字節(jié)數(shù)組,所以可以和[]byte類(lèi)型互換。
s:="abc"
b:=[]byte(s)
s2:=string(b)
概念上,[]byte(s)轉(zhuǎn)換操作會(huì)分配新的字節(jié)數(shù)組,拷貝填入s含有的字節(jié),并生成一個(gè)slice的引用,指向整個(gè)數(shù)組。反之,用string(b)也會(huì)產(chǎn)生一份副本而不是操作真正的b,以此保證上面s2不變。
字符串不可變
字符串是不可變的,表現(xiàn)在其字符串值不可修改。平時(shí)我們看到的字符串修改操作、拼接操作并不改變?cè)械淖址?,而是將操作后生成新的字符串值賦予原來(lái)的變量。
s:="leftfoot"
t:=s
s+=",rightfoot"
盡管字符串創(chuàng)建后,它底層的字節(jié)slice不可變,但是普通的字節(jié)slice是可以隨意改變的。
vara=[]byte{'h','e','l','l','o'}
fmt.Printf("%p,%[1]q\n",a)//0xc00000a098,"hello"
a[4]=''
fmt.Printf("%p,%[1]q\n",a)//0xc00000a098,"hell"
由于字符串的不可變以及避免頻繁的操作字符串而導(dǎo)致的多次內(nèi)存分配和復(fù)制,可以使用bytes.Buffer類(lèi)型。
見(jiàn)GOPL的一個(gè)例子:
funcintsToString(values[]int)string{
varbufbytes.Buffer
buf.WriteByte('[')
fori,v:=rangevalues{
ifi0{
buf.WriteString(",")
fmt.Fprintf(amp;buf,"%d",v)
buf.WriteByte(']')
returnbuf.String()
funcmain(){
fmt.Println(intsToString([]int{1,2,3}))//[1,2,3]
追加ASCII字符可以用writeByte,追加UTF-8編碼的文字符號(hào),最好用WriteRune方法。
基本類(lèi)型的值都是可比較的
基本類(lèi)型的值都是可比較的,如布爾值、數(shù)值、字符串等。
數(shù)值的類(lèi)型轉(zhuǎn)換
很多整型整型的轉(zhuǎn)換不會(huì)引起值的變化,僅告知編譯器如何解讀這么值。但縮減大小的類(lèi)型轉(zhuǎn)換,以及整型與浮點(diǎn)型的相互轉(zhuǎn)換,會(huì)因此值的改變或者損失精度。
浮點(diǎn)型轉(zhuǎn)整型會(huì)舍棄小數(shù)部分并向0取整。
varf=3.526
i:=int(f)
fmt.Printf("f:%v,i:%v\n",f,i)//f:3.526,i:3
vari16=int16(555)
vari8=int8(i16)
fmt.Printf("i16:%v,i8:%v\n",i16,i8)//i16:555,i8:43
運(yùn)算符
運(yùn)算符降序排列:
*/%amp;amp;^
+-|^
==!===
amp;amp;
二元運(yùn)算符分為五大優(yōu)先級(jí)。同級(jí)別的運(yùn)算符滿(mǎn)足左結(jié)合律,可以用圓括號(hào)指定次序。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 可穿戴設(shè)備市場(chǎng)發(fā)展趨勢(shì)分析
- 2026年物流管理專(zhuān)業(yè)學(xué)生實(shí)踐考試題物流規(guī)劃與優(yōu)化案例分析題
- 2026年工業(yè)自動(dòng)化系統(tǒng)調(diào)試模擬題
- 2026年銀行職員招聘考試金融知識(shí)會(huì)計(jì)實(shí)務(wù)模擬試題
- 2026年電子商務(wù)營(yíng)銷(xiāo)專(zhuān)家網(wǎng)絡(luò)營(yíng)銷(xiāo)策略分析與實(shí)施模擬試題及答案
- 2026年電氣工程師專(zhuān)業(yè)招聘筆試題庫(kù)大全
- 2026年大學(xué)入學(xué)考試英語(yǔ)筆試模擬題
- 2026年會(huì)計(jì)師中級(jí)職稱(chēng)考試核心題目與詳解
- 2026年注冊(cè)會(huì)計(jì)師財(cái)務(wù)成本管理預(yù)測(cè)模擬試題
- 2026年能源行業(yè)面試問(wèn)題及答案參考
- 兩癌預(yù)防知識(shí)講座
- 用電安全隱患檢測(cè)的新技術(shù)及應(yīng)用
- 新疆克州阿合奇縣2024-2025學(xué)年七年級(jí)上學(xué)期期末質(zhì)量檢測(cè)英語(yǔ)試卷(含答案及聽(tīng)力原文無(wú)音頻)
- 《水庫(kù)泥沙淤積及影響評(píng)估技術(shù)規(guī)范》
- 2023-2024學(xué)年浙江省杭州市西湖區(qū)教科版五年級(jí)上冊(cè)期末考試科學(xué)試卷
- GB/T 7948-2024滑動(dòng)軸承塑料軸套極限PV試驗(yàn)方法
- DL∕T 1057-2023 自動(dòng)跟蹤補(bǔ)償消弧線圈成套裝置技術(shù)條件
- AQ 2003-2018 軋鋼安全規(guī)程(正式版)
- 兒童特發(fā)性矮身材診斷與治療中國(guó)專(zhuān)家共識(shí)(2023版)解讀
- 村委會(huì)指定監(jiān)護(hù)人證明書(shū)模板
- 送給業(yè)主禮物方案
評(píng)論
0/150
提交評(píng)論