1.1.有符號(hào)整數(shù)類(lèi)型整數(shù)類(lèi)型就是存放整數(shù)的,如
18
,-18
,123534
等,在GO語(yǔ)言中,幾乎不同于其它語(yǔ)言,以字節(jié)的視角來(lái)看其int類(lèi)型還分為不同的int表達(dá),首先int還要分為兩大類(lèi)。
有符號(hào)就是整數(shù)有正負(fù)之分
我們來(lái)看下圖:
可以看到,這4個(gè)int后面都帶了數(shù)字,這其實(shí)就是這個(gè)int類(lèi)型占用內(nèi)存大的比特位,比如int8,就是這個(gè)int類(lèi)型大只能占用8個(gè)比特位,也就是一個(gè)字節(jié)(1個(gè)字節(jié) == 8個(gè)比特位),其他的int也是這樣來(lái)看的,這中分類(lèi)也就確定了各個(gè)int的表數(shù)范圍,所以我們?cè)诙x一個(gè)整型值使,要估摸這個(gè)整型值的范圍,再來(lái)確定使用哪個(gè)int的類(lèi)型。
- 我們可以看看這些表示int的類(lèi)型其大小是不是如此呢?
package main
import (
"fmt"
"unsafe"
)
func main(){var num1 int8
fmt.Println(unsafe.Sizeof(num1))
var num2 int16
fmt.Println(unsafe.Sizeof(num2))
var num3 int32
fmt.Println(unsafe.Sizeof(num3))
var num4 int64
fmt.Println(unsafe.Sizeof(num4))
}
可以看到,不同的int類(lèi)型其字節(jié)大小的確不同。
- 如果說(shuō)int類(lèi)型賦值不當(dāng)就會(huì)出現(xiàn)如下的錯(cuò)誤:
package main
import "fmt"
func main(){var num1 int8 = 666 // int8 不能承受666這個(gè)值
fmt.Println(num1)
}
也就是說(shuō)666
不能作為值賦給int8
,不然編譯就會(huì)出問(wèn)題,應(yīng)該使用更高存儲(chǔ)字節(jié)空間的int類(lèi)型來(lái)存放。
無(wú)符號(hào)整數(shù)類(lèi)型就是沒(méi)有負(fù)數(shù)之說(shuō)只有整正數(shù)(沒(méi)有符號(hào)位)
我們來(lái)看下圖:
可以看到,無(wú)符號(hào)整數(shù)類(lèi)型在有符號(hào)整數(shù)類(lèi)型int的前面多了一個(gè)u
,這就是表示無(wú)符號(hào)的意思,值得注意的是,其占用儲(chǔ)存空間的字節(jié)大小沒(méi)有變化,但表數(shù)范圍變了,變得沒(méi)有負(fù)數(shù)了,大值更大了,這就是無(wú)符號(hào)整型的優(yōu)勢(shì),如果你想表達(dá)的數(shù)據(jù)咬定沒(méi)有負(fù)數(shù),那么選無(wú)符號(hào)整型類(lèi)型會(huì)更好些(如表示身高,年齡)。
- 當(dāng)然,如果用無(wú)符號(hào)整型取存放負(fù)數(shù),這也是會(huì)嚴(yán)格的報(bào)錯(cuò)的
我們來(lái)看下圖:
可以看到,int
和uint
他們的字節(jié)大小是由計(jì)算機(jī)系統(tǒng)的位數(shù)來(lái)決定的,rune就相當(dāng)于int32
,byte
相當(dāng)于uint8
(在后面byte
可以用作字符
的類(lèi)型)。
定義如下:
package main
import "fmt"
func main(){var a int = 3
var b uint = 5
var c rune = 10
var d byte = 20
var e byte = 'a'
}
1.4.額外知識(shí)Golang的整數(shù)類(lèi)型,默認(rèn)聲明為int類(lèi)型
變量占用的字節(jié)數(shù)
首先要求變量所占用的字節(jié)數(shù),需要引入
unsafe
這個(gè)包,然后使用這個(gè)包里面的Sizeof
來(lái)求
package main
import (
"fmt"
"unsafe" // 引入包
)
func main(){// 直接使用
var num1 int8
fmt.Println(unsafe.Sizeof(num1)) // 1
var num2 int16
fmt.Println(unsafe.Sizeof(num2)) // 2
var num3 int32
fmt.Println(unsafe.Sizeof(num3)) // 4
var num4 int64
fmt.Println(unsafe.Sizeof(num4)) // 8
}
// 表示學(xué)生年齡
var age byte = 8 // 小的數(shù)據(jù)盡量用byte存放
2.浮點(diǎn)類(lèi)型簡(jiǎn)單來(lái)說(shuō),浮點(diǎn)類(lèi)型就是用來(lái)存放小樹(shù)值的, 如
3.14
,5.20
,-13.14
。
看下圖:
在GO語(yǔ)言中,要?jiǎng)?chuàng)建浮點(diǎn)類(lèi)型的變量,必須在float
后面加上32
或者64
,因?yàn)?code>單純的一個(gè)float不會(huì)被當(dāng)作浮點(diǎn)類(lèi)型。
package main
import (
"fmt"
)
func main(){var fa float32 = 314E-2 // E-2表示乘以10^-2
var fb float32 = 314E+2 // E+2表示乘以10^2
var fc float32 = 314e-2 // 小寫(xiě)e與大寫(xiě)E沒(méi)有區(qū)別
var fd float32 = 3.14 // 直接賦值3.14
fmt.Println(fa) // 3.14
fmt.Println(fb) // 31400
fmt.Println(fc) // 3.14
fmt.Println(fd) // 3.14
}
float64
。package main
import "fmt"
func main(){//浮點(diǎn)數(shù)可能會(huì)有精度的損失,所以通常情況下,建議你使用:float64
var num7 float32 = 520.000001314
fmt.Println(num7)
var num8 float64 = 520.000001314
fmt.Println(num8)
}
運(yùn)行結(jié)果:
- Golang中沒(méi)有專(zhuān)門(mén)的字符類(lèi)型,如果要存儲(chǔ)單個(gè)字符(字母),一般使用
byte
來(lái)保存。- Golang中字符使用UTF-8編碼
UTF-8編碼鏈接
UTF-8編碼:
byte類(lèi)型來(lái)定義一個(gè)字符變量
,將其打印出來(lái)的值是其對(duì)應(yīng)的ASCLL
碼值,各個(gè)字符的ASCLL
碼值對(duì)應(yīng)如下:
示例如下:
所以字符類(lèi)型,本質(zhì)上就是一個(gè)整數(shù),也可以直接參與運(yùn)算,輸出字符的時(shí)候,會(huì)將對(duì)應(yīng)的碼值做一個(gè)輸出,但如果我們用Printf
打?。ɡㄌ?hào)里要用%c
),可以打印出字符:
如果我們想要打印中文字符,比如打印一個(gè)中,這時(shí)
byte
類(lèi)型就存放不下其對(duì)應(yīng)的ASCLL
碼值了,所以這時(shí)我們應(yīng)該使用int
。
package main
import "fmt"
func main(){var c int = '中'
fmt.Println(c)
//漢字字符,底層對(duì)應(yīng)的是Unicode碼值
//對(duì)應(yīng)的碼值為20013,byte類(lèi)型溢出,能存儲(chǔ)的范圍:可以用int
//總結(jié):Golang的字符對(duì)應(yīng)的使用的是UTF-8編碼
//(Unicode是對(duì)應(yīng)的字符集,UTF-8是Unicode的其中的一種編碼方案)
}
看下圖:
通俗來(lái)說(shuō):
\b
就是往前挪一格,掩蓋挪動(dòng)的那一格的數(shù)據(jù)。
就是換行,這個(gè)不用多說(shuō)(haha)
\r
就是光標(biāo)回到本行的開(kāi)頭,將\r
后面的字符依次覆蓋前面的字符。
\t
就是將\t
前面的字符串補(bǔ)夠8個(gè)位置(不夠8個(gè)位置),不夠的話(huà),則從那夠了的8個(gè)再往后數(shù)。
\"
,\'
,\\
'
,\
打印出來(lái)而不是與旁邊的""
,''
,或者是轉(zhuǎn)義匹配。例如:
- 布爾類(lèi)型也叫bool類(lèi)型,bool類(lèi)型數(shù)據(jù)只允許取值true和false。
- 布爾類(lèi)型占1個(gè)字節(jié)。
- 布爾類(lèi)型適于邏輯運(yùn)算,一般用于程序流程控制。
基本的使用:
package main
import "fmt"
func main(){//測(cè)試布爾類(lèi)型的數(shù)值:
var flag1 bool = true
fmt.Println(flag1) // true
var flag2 bool = false
fmt.Println(flag2) // false
var flag3 bool = 5< 9
fmt.Println(flag3) // true,因?yàn)?的確小于9:為真
}
5.字符串類(lèi)型
- 字符串類(lèi)型用
string
來(lái)定義。- 字符串定義后就不能改變了(單指字符串,變量的值可以變)。
- 字符串可以拼接。
- 當(dāng)一個(gè)字符串里面有轉(zhuǎn)義的時(shí)候最好用 `` (
Esc
下面的按鍵)括起來(lái)(當(dāng)然轉(zhuǎn)義字符也可以)。- 當(dāng)一個(gè)字符串過(guò)長(zhǎng)時(shí),最好換行,而換行的時(shí)候最好將運(yùn)算符放在一行的最后面,因?yàn)槿绻皇欠?hào)在最后面,編譯器會(huì)自動(dòng)在這一行的后面加上
;
,我們看不見(jiàn)而已。
示例:
package main
import "fmt"
func main(){// 定義一個(gè)字符串
var str1 string = "hello golang"
fmt.Println(str1) // hello golang
// 轉(zhuǎn)義字符過(guò)多時(shí)用``括起來(lái)
var str2 string = `package main
import "fmt"
func main(){
fmt.Println("abc\"d\"efghijklm\\nopqrs\\tuvw")
// abc"d"efghijklm\nopqrs\tuvw
}`
// 字符串拼接
var str3 string = "hahaha" + "hehehe"
str3 += "iloveyou"
fmt.Println(str3) // hahahaheheheiloveyou
//當(dāng)一個(gè)字符串過(guò)長(zhǎng)的時(shí)候:注意:+保留在上一行的最后
var str4 string = "abc" + "def" + "abc" + "def" + "abc" + "def" + "abc" +
"def"+ "abc" + "def" + "abc" + "def"+ "abc" + "def" + "abc" + "def"+
"abc" + "def" + "abc" + "def"+ "abc" + "def" + "abc" + "def"+ "abc" +
"def" + "abc" + "def"+ "abc" + "def" + "abc" + "def"+ "abc" + "def" +
"abc" + "def"+ "abc" + "def"
fmt.Println(str4)
}
6.基本數(shù)據(jù)類(lèi)型的默認(rèn)值在Golang中數(shù)據(jù)類(lèi)型都有一個(gè)默認(rèn)值,當(dāng)程序員沒(méi)有賦值時(shí),就會(huì)保留默認(rèn)值(默認(rèn)值又叫零值)。
Go在不同類(lèi)型的變量之間賦值時(shí)需要顯式轉(zhuǎn)換,并且只有顯式轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換)。
語(yǔ)法形式:
表達(dá)式T(v)將值v轉(zhuǎn)換為類(lèi)型T
T : 就是數(shù)據(jù)類(lèi)型
v : 就是需要轉(zhuǎn)換的變量
例如:
package main
import "fmt"
func main(){var num1 int = 1000
var f1 float32 = float32(num1)
fmt.Println(f1) // 1000
var f2 float32 = 666.66
var num2 int = int(f2)
fmt.Println(num2) // 66
}
但如過(guò)一個(gè)大的值強(qiáng)制轉(zhuǎn)換為一個(gè)不能存放這個(gè)大數(shù)據(jù)的值的類(lèi)型時(shí),編譯器不會(huì)報(bào)錯(cuò),但運(yùn)行后會(huì)造成數(shù)據(jù)的溢出(截?cái)啵?br />例如:
package main
import "fmt"
func main(){// 將int64轉(zhuǎn)為int8的時(shí)候,編譯不會(huì)出錯(cuò)的,但是會(huì)數(shù)據(jù)的溢出
var n1 int64 = 666666
var n2 int8 = int8(n3)
// 這里發(fā)生了截?cái)? fmt.Println(n2)//56
}
8.基本數(shù)據(jù)類(lèi)型轉(zhuǎn)為string
- 在程序開(kāi)發(fā)中,我們經(jīng)常需要將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)成string類(lèi)型?;蛘邔tring類(lèi)型轉(zhuǎn)成基本數(shù)據(jù)類(lèi)型。
- 將基本數(shù)據(jù)類(lèi)型轉(zhuǎn)化為
string
有兩種方式:
1.fmt
包中的Sprintf
(“%參數(shù)”
,要轉(zhuǎn)換的變量
(注意
:原先的變量值不變,只是將面值賦給一個(gè)string類(lèi)型的變量))—推薦
。
2.使用strconv
包中的函數(shù)。
package main
import "fmt"
func main(){var n1 int = 19
var n2 float32 = 4.78
var n3 bool = false
var n4 byte = 'a'
var s1 string = fmt.Sprintf("%d",n1)
fmt.Printf("s1對(duì)應(yīng)的類(lèi)型是:%T ,s1 = %q \n",s1, s1)
var s2 string = fmt.Sprintf("%f",n2)
fmt.Printf("s2對(duì)應(yīng)的類(lèi)型是:%T ,s2 = %q \n",s2, s2)
var s3 string = fmt.Sprintf("%t",n3)
fmt.Printf("s3對(duì)應(yīng)的類(lèi)型是:%T ,s3 = %q \n",s3, s3)
var s4 string = fmt.Sprintf("%c",n4)
fmt.Printf("s4對(duì)應(yīng)的類(lèi)型是:%T ,s4 = %q \n",s4, s4)
}
strconv
包,以及包中我們將要用到的函數(shù)。根據(jù)函數(shù)的功能及使用,如下轉(zhuǎn)換:
package main
import(
"fmt"
"strconv"
)
func main(){var n1 int = 18
var s1 string = strconv.FormatInt(int64(n1),10) //參數(shù):第一個(gè)參數(shù)必須轉(zhuǎn)為int64類(lèi)型 ,第二個(gè)參數(shù)指定字面值的進(jìn)制形式為十進(jìn)制
fmt.Printf("s1對(duì)應(yīng)的類(lèi)型是:%T ,s1 = %q \n",s1, s1)
var n2 float64 = 4.29
var s2 string = strconv.FormatFloat(n2,'f',9,64)
//第二個(gè)參數(shù):'f'(-ddd.dddd) 第三個(gè)參數(shù):9 保留小數(shù)點(diǎn)后面9位 第四個(gè)參數(shù):表示這個(gè)小數(shù)是float64類(lèi)型
fmt.Printf("s2對(duì)應(yīng)的類(lèi)型是:%T ,s2 = %q \n",s2, s2)
var n3 bool = true
var s3 string = strconv.FormatBool(n3)
fmt.Printf("s3對(duì)應(yīng)的類(lèi)型是:%T ,s3 = %q \n",s3, s3)
}
9.string
轉(zhuǎn)為基本數(shù)據(jù)類(lèi)型將
string
轉(zhuǎn)為基本數(shù)據(jù)類(lèi)型的方式是使用strconv
包中的函數(shù)。
下面通過(guò)使用函數(shù)來(lái)代碼實(shí)現(xiàn)轉(zhuǎn)化:
package main
import(
"fmt"
"strconv"
)
func main(){//1. string 轉(zhuǎn) bool
//string-->bool
var s1 string = "true"
var b bool
//ParseBool這個(gè)函數(shù)的返回值有兩個(gè):(value bool, err error)
//value就是我們得到的布爾類(lèi)型的數(shù)據(jù),err出現(xiàn)的錯(cuò)誤
//我們只關(guān)注得到的布爾類(lèi)型的數(shù)據(jù),err可以用_直接忽略
b , _ = strconv.ParseBool(s1)
fmt.Printf("b的類(lèi)型是:%T,b=%v \n",b,b)
//2. string 轉(zhuǎn) int64
//string---》int64
var s2 string = "19"
var num1 int64
num1,_ = strconv.ParseInt(s2,10,64)
fmt.Printf("num1的類(lèi)型是:%T,num1=%v \n",num1,num1)
//3. string 轉(zhuǎn) float64
//string-->float32/float64
var s3 string = "3.14"
var f1 float64
f1,_ = strconv.ParseFloat(s3,64)
fmt.Printf("f1的類(lèi)型是:%T,f1=%v \n",f1,f1)
//4.
//注意:string向基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換的時(shí)候,
//一定要確保string類(lèi)型能夠
//轉(zhuǎn)成有效的數(shù)據(jù)類(lèi)型,
//否則最后得到的結(jié)果就是按照對(duì)應(yīng)類(lèi)型的默認(rèn)值輸出
var s4 string = "golang"
var b1 bool
b1 , _ = strconv.ParseBool(s4)
fmt.Printf("b1的類(lèi)型是:%T,b1=%v \n",b1,b1)
//5.
var s5 string = "golang"
var num2 int64
num2,_ = strconv.ParseInt(s5,10,64)
fmt.Printf("num2的類(lèi)型是:%T,num2=%v \n",num2,num2)
}
運(yùn)行結(jié)果為:
寫(xiě)在最后可以看到,b1與 num2的值都是默認(rèn)值。
GO語(yǔ)言需要求精的地方多,不能放過(guò)每一個(gè)部分,不然出來(lái)的代碼就很可能會(huì)不夠嚴(yán)謹(jǐn)。
感謝閱讀本小白的博客,錯(cuò)誤的地方請(qǐng)嚴(yán)厲指出噢!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱(chēng):GO語(yǔ)言基本數(shù)據(jù)類(lèi)型-創(chuàng)新互聯(lián)
標(biāo)題來(lái)源:http://jinyejixie.com/article16/djcigg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、定制開(kāi)發(fā)、網(wǎng)站導(dǎo)航、品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容