




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明每一個變量都有數(shù)據(jù)類型,Go中的數(shù)據(jù)類型有:
簡單數(shù)據(jù)類型:int、float、complex、bool和string數(shù)據(jù)結(jié)構(gòu)或組合(composite):struct、array、slice、map和channel接口(interface)
當(dāng)聲明變量的時候,會做默認(rèn)的賦0初始化。每種數(shù)據(jù)類型的默認(rèn)賦0初始化的0值不同,例如int類型的0值為數(shù)值0,float的0值為0.0,string類型的0值為空,bool類型的0值為false,數(shù)據(jù)結(jié)構(gòu)的0值為nil,struct的0值為字段全部賦0。
其實函數(shù)也有類型,不過一般稱之為返回類型。例如,下面的函數(shù)foo的返回類型是int:
funcfoo()int{
...CODE...
returnINT_TYPE_VALUE
函數(shù)允許有多個返回值,它們使用逗號分隔,括號包圍:
funcfoo()(int,bool)
Number類型
Integer
Integer類型是整型數(shù)據(jù),例如32201-3-22等。
Go中的Integer有以下幾種細(xì)分的類型:
int8,int16,int32,int64uint8,uint16,uint32,uint64byteruneint,uint
其中8163264表示該數(shù)據(jù)類型能存儲的bit位數(shù)。例如int8表示能存儲8位數(shù)值,所以這個類型占用1字節(jié),也表示最大能存儲的整型數(shù)共2^8=256個,所以int8類型允許的最大正數(shù)為127,允許的最小負(fù)數(shù)為-128,共256個數(shù)值。
uint中的u表示unsigned,即無符號整數(shù),只保存0和正數(shù)。所以uint8能存儲256個數(shù)的時候,允許的最小值為0,允許的最大值為255。
額外的兩種Integer是byte和rune,它們分別等價于uint8(即一個字節(jié)大小的正數(shù))、int32。從builtin包中的定義就可以知道:
$godocbuiltin|grep-E"byte|rune"
typebyte=uint8
typerune=int32
byte類型后面會詳細(xì)解釋。
還有兩種依賴于CPU位數(shù)的類型int和uint,它們分別表示一個機器字長。在32位CPU上,一個機器字長為32bit,共4字節(jié),在64位CPU上,一個機器字長為64bit,共8字節(jié)。除了int和uint依賴于CPU架構(gòu),還有一種uintptr也是依賴于機器字長的。
一般來說,需要使用整型數(shù)據(jù)的時候,指定int即可,有明確的額外需求時再考慮是否換成其它整數(shù)類型。
在整數(shù)加上0前綴表示這是8進制,例如077。加上前綴0x表示這是16進制,例如0x0c,使用e符號可以表示這是一個科學(xué)計數(shù)法,如1e3=1000,6.023e23=6.023x10^23。
可以使用TYPE(N)的方式來生成一個數(shù)值,例如a:=uint64(5)。實際上這是類型轉(zhuǎn)換,將int類型的5轉(zhuǎn)換成int64類型的5。
byte類型
Go中沒有專門提供字符類型char,Go內(nèi)部的所有字符類型(無論是ASCII字符還是其它多字節(jié)字符)都使用整數(shù)值保存,所以字符可以存放到byte、int等數(shù)據(jù)類型變量中。byte類型等價于uint8類型,表示無符號的1字節(jié)整數(shù)。
Go中的字符都使用單引號包圍,例如a、我,但單引號中包含了多個字符是錯誤的(如aA),因為字符類型就是一個字符。
例如,ASCII的字母a表示97。下面這種定義方式是允許的:
varabyte='A'//a=65
varbuint8='a'//b=97
注意,字符必須使用單引號,且必須只能是單個字符。所以byte類型經(jīng)常被稱為character類型。
以下也都是允許的:
vara='A'
varauint32='A'
varaint64='A'
所以,Integer類型當(dāng)存儲的是以單引號包圍的字符時,它會將字符轉(zhuǎn)換成它二進制值對應(yīng)的數(shù)值。同樣適用于unicode字符,它將用來存放各字節(jié)對應(yīng)的二進制的數(shù)值:
varaint64='我'//a=25105
由于我在Go中占用3字節(jié),所以保存到byte中是報錯的:
varabyte='我'
可以保存它的unicode字符的代碼點:
varabyte='\u0041'//a=65,代表的字符A
如果不知道代碼點的值,可以將其以int類型保存并輸出。
fmt.Printf("%d",'我')//25105
如果想將byte值轉(zhuǎn)換為字符,可以使用string()函數(shù)做簡單的類型轉(zhuǎn)換:
vara='A'
println(string(a))//輸出:A
float和complex
float是浮點數(shù)(俗稱小數(shù)),例如0.03.0-3.12-3.120等。
Go中的浮點數(shù)類型float有兩種:float32和float64。
complex表示復(fù)數(shù)類型(虛數(shù)),有complex64和complex128。
浮點數(shù)在計算機系統(tǒng)中非常復(fù)雜,對于學(xué)習(xí)來說,只需將其認(rèn)為是數(shù)學(xué)中的一種小數(shù)即可。但以下幾個注意點需要謹(jǐn)記心中:
浮點數(shù)是不精確的。例如1.01-0.99從數(shù)學(xué)運算的角度上得到的值是0.02,但實際上的結(jié)果是0.020000000000000018(python運算的結(jié)果),在Go中會將其表示為+2.000000e-002。這個結(jié)果是一種極限趨近于我們期待值的結(jié)果。float32的精度(7個小數(shù)位)低于float64(15個小數(shù)位),所以float64類型的值比float32類型的值更精確。因為浮點數(shù)不精確,所以盡量不要對兩個浮點數(shù)數(shù)進行等值==和不等值!=比較,例如(3.2-2.8)==0.4返回Flase。如果非要比較,應(yīng)該通過它們的減法求絕對值,再與一個足夠小(不會影響結(jié)果)的值做不等比較,例如abs((3.2-2.8)-0.4)0.0002返回True。
一般來說,在程序中需要使用浮點數(shù)的時候都使用float64類型,不僅因為精確,更因為幾乎所有包中需要float參數(shù)的類型都是float64。
在Go的數(shù)學(xué)運算中,默認(rèn)取的是整型數(shù)據(jù),如果想要得到浮點數(shù)結(jié)果,必須至少讓運算的一方寫成浮點數(shù)格式:
vara:=3/2//a得到截斷的整數(shù):a=1
varb:=3/2.0//b為浮點數(shù)b=+1.500000e+000
varc:=3+2.0//c為浮點數(shù)
string類型
Go中的string用于保存UTF-8字符序列,它是動態(tài)大小的。對于字母和英文字母,它占用一個字節(jié),對于其它unicode字符,按需占用2-4個字節(jié)。例如中文字符占用3個字節(jié)。
Go中的string類型要使用雙引號或反引號包圍,它們的區(qū)別是:
雙引號是弱引用,其內(nèi)可以使用反斜線轉(zhuǎn)義符號,如ab\ncd表示ab后換行加cd反引號是強引用,其內(nèi)任何符號都被強制解釋為字面意義,包括字面的換行。也就是所謂的裸字符串。
funcmain(){
println("abc\ndef")
println(`ABC
DEF`)
上面的結(jié)果將輸出:
abc
不能使用單引號包圍,單引號包圍的表示它的二進制值轉(zhuǎn)換成十進制的數(shù)值。例如字母對應(yīng)的是ASCII碼。這個在前面byte類型中介紹過。所以,使用單引號包圍的字符實際上是整數(shù)數(shù)值。例如a等價于97。
string的底層是byte數(shù)組,每個string其實只占用兩個機器字長:一個指針和一個長度。只不過這個指針在Go中完全不可見,所以對我們來說,string是一個底層byte數(shù)組的值類型而非指針類型。
所以,可以將一個string使用append()或copy()拷貝到一個給定的byteslice中,也可以使用slice的切片功能截取string中的片段。
funcmain(){
vara="HelloGaoxiaofang"
println(a[2:3])//輸出:l
s1:=make([]byte,30)
copy(s1,a)//將字符串保存到slice中
println(string(s1))//輸出"HelloGaoxiaofang"
字符串串接
使用加號+連接兩段字符串:Hello+World等價于HelloWorld。
可以通過+的方式將多行連接起來。例如:
str:="Beginningstring"+
"secondstring"
字符串連接+操作符強制認(rèn)為它兩邊的都是string類型,所以abcd+2將報錯。需要先將int類型的2轉(zhuǎn)換為字符串類型(不能使用string(2)的方式轉(zhuǎn)換,因為這種轉(zhuǎn)換方式不能跨大類型轉(zhuǎn)換,只能使用strconv包中的函數(shù)轉(zhuǎn)換)。
另一種更高效的字符串串接方式是使用strings包中的Join()函數(shù),它可以在緩沖中將字符串串接起來。
字符串長度
使用len()取字節(jié)數(shù)量(不是字符數(shù)量)。
例如len(abcde)返回5,size(我是中國人)返回15。
字符串截取
可以將字符串當(dāng)作數(shù)組,使用索引號取部分字符串(按字節(jié)計算),索引號從0開始計算,如abcd[1]。
從字符串取字符的時候,需要注意的是index按字節(jié)計算而非按字符計算。兩種取數(shù)據(jù)方式:
"string"[x]
"string"[x:y]
第一種方式將返回第(x+1)個字節(jié)對應(yīng)字符的二進制數(shù)值,例如字母將轉(zhuǎn)換為ASCII碼,unicode將取對應(yīng)字節(jié)的二進制轉(zhuǎn)換為數(shù)值。
第二種方式將返回第(x+1)字節(jié)到第y字節(jié)中間的字符,Go中采取左閉右開的方式,所以所截取部分包括index=x,但不包括index=y。
例如:
funcmain(){
println("abcde"[1])//(1).輸出"98"
println("我是中國人"[1])//(2).輸出"136"
println("abcde"[0:2])//(3).輸出"ab"
println("我是中國人"[0:3])//(4).輸出"我"
println("abcde"[3:4])//(5).輸出"d"
分析每一行語句:
(1).取第2個字節(jié)的二進制值,即字符b對應(yīng)的值,其ASCII為98(2).取第2個字節(jié)的二進制值,因為中文占用3個字節(jié),所以取第一個字符我的第二個字節(jié)部分,轉(zhuǎn)換為二進制值,為136(3).取第1個字節(jié)到第3個字節(jié)(不包括)中間的字符,所以輸出ab(4).取前三個字節(jié)對應(yīng)的字符,所以輸出我(5).取第4個字節(jié)對應(yīng)的字符,所以輸出d
字符串遍歷
字符串是字符數(shù)組,如果字符串中全是ASCII字符,直接遍歷即可,但如果包含了多字節(jié)字符,則可以[]rune(str)轉(zhuǎn)換后后再遍歷。
packagemain
import"fmt"
funcmain(){
str:="Hello你好"
r:=[]rune(str)//8
fori:=0;ilen(r);i++{
fmt.Printf("%c",r[i])
字符串比較
可以使用====!=對字符串進行比較,它將一個字符一個字符地比對。字母以A-Za-z的ASCII方式排列。
//字符串比較
println("a""B")//false
//數(shù)值比較,不是字符串比較
println('a'==97)//true
修改字符串
字符串是一個不可變對象,所以對字符串s截取后賦值的方式s[1]=c會報錯。
要想修改字符串中的字符,必須先將字符串拷貝到一個byteslice中,然后修改指定索引位置的字符,最后將byteslice轉(zhuǎn)換回string類型。
例如,將gaoxiaofang改為maoxiaofang:
s:="gaoxiaofang"
bs:=[]byte(s)
bs[0]='m'//必須使用單引號
s=string(bs)
println(s)
注意修改字符的時候,必須使用單引號,因為它是byte類型。
布爾類型(bool)
bool類型的值只有兩種:true和false。
有3種布爾邏輯運算符:||!,分別別是邏輯與,邏輯或,取反。
funcmain(){
println(truetrue)//true
println(truefalse)//false
println(true||true)//true
println(true||false)//true
println(!true)//false
Go是一門非常嚴(yán)格的怨言,在使用==進行等值比較的時候,要求兩邊的數(shù)據(jù)類型必須相同,否則報錯。如果兩邊數(shù)據(jù)類型是接口類型,則它們必須實現(xiàn)相同的接口函數(shù)。如果是常量比較,則兩邊必須是能夠兼容的數(shù)據(jù)類型。
在printf類的函數(shù)的格式中,占位符%t用于代表布爾值。
布爾類型的變量、函數(shù)名應(yīng)該以is或Is的方式開頭來表明這是一個布爾類型的東西。例如isSorted()函數(shù)用于檢測內(nèi)容是否已經(jīng)排序,IsFinished()用于判斷是否完成。
type關(guān)鍵字:類型別名
可以使用type定義自己的數(shù)據(jù)類型,例如struct、interface。
還可以使用type定義類型的別名。例如,定義一個int類型的別名INT:
typeINTint
這樣IN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年江蘇省南京市玄武區(qū)中考一模歷史試卷
- 逐步提升2025年二級消防工程師試題及答案
- 《小狐貍借尾巴課件》
- 應(yīng)對中級會計挑戰(zhàn)的試題與答案技巧
- 設(shè)備維護培訓(xùn)資料
- 2025年魚、蝦雌核發(fā)育系項目合作計劃書
- 材料解析 2024年高級審計師考試試題及答案
- 黑龍江省哈爾濱市香坊區(qū)2024-2025年九下二模 語文試卷(含答案)
- 2025年特種設(shè)備檢驗檢測合作協(xié)議書
- 高級會計的前景預(yù)測試題及答案
- 滅火和應(yīng)急疏散流程圖
- 重大危險源評估標(biāo)準(zhǔn)
- 施工材料供應(yīng)保障措施
- 2022年《道德經(jīng)》全文+拼音
- sql優(yōu)化-oracle數(shù)據(jù)庫ppt課件
- 統(tǒng)編版《道德與法治》四年級下冊第10課《我們當(dāng)?shù)氐娘L(fēng)俗》精品課件
- 土地模板-市場比較法
- 家具廠首件檢驗記錄表
- 太上碧落洞天慈航靈感度世寶懺
- 國家標(biāo)準(zhǔn)硬度轉(zhuǎn)換表參考模板
- 輪胎式裝載機檢測報告(共5頁)
評論
0/150
提交評論