本文實(shí)例分析了GO語(yǔ)言基本類(lèi)型。分享給大家供大家參考。具體如下:
一、整型
go語(yǔ)言有13種整形,其中有2種只是名字不同,實(shí)質(zhì)是一樣的,所以,實(shí)質(zhì)上go語(yǔ)言有11種整形。如下:
(1)int :依賴不同平臺(tái)下的實(shí)現(xiàn),可以是int32或int64
(2)int8 : (-128->127)
(3)int16: (-32768->32767)
(4)int32: (-2 147 483 648->2 147 483 647)
(5)int64 :(-9 223 372 036 854 775 808->9 223 372 036 854 775 807)
(6)unit : 依賴不同平臺(tái)下的實(shí)現(xiàn),可以是int32或int64
(7)unit8 (又名byte): (0->255)
(8)unit16 : (0->65535)
(9)unit32 (又名rune): (0->4 294 967 295)
(10)unit64 : (0->18 446 744 073 709 551 615)
(11)unitptr : 恰好容納指針值的類(lèi)型,對(duì)32位平臺(tái)是unit32,對(duì)64位平臺(tái)是unit64
(PS : 值得注意的是,go語(yǔ)言中沒(méi)有自動(dòng)類(lèi)型轉(zhuǎn)換,這意味著,除了上篇博文分析的比較運(yùn)算符之外,其他的操作符基本需要類(lèi)型轉(zhuǎn)換,才能進(jìn)行操作。否則就是編譯錯(cuò)誤)
二、浮點(diǎn)類(lèi)型
go語(yǔ)言有2種類(lèi)型的浮點(diǎn)和兩種類(lèi)型的復(fù)數(shù)類(lèi)型。
(1) float32(-3.402...×1038->3.402...×1038)
(2) float64(-1.797...×10308->+1.797...×10308)
(3) complex64( 實(shí)部、虛部都是一個(gè)float32 )
(4) complex128 ( 實(shí)部、虛部都是一個(gè)float64 )
(PS:標(biāo)準(zhǔn)庫(kù)math包中,包含了眾多數(shù)學(xué)函數(shù),其中所有函數(shù)均使用float64,
標(biāo)準(zhǔn)庫(kù)math/cmplx包含眾多復(fù)數(shù)相關(guān)的數(shù)學(xué)函數(shù),其中所有函數(shù)均使用complex128)
(PPS : 跟數(shù)學(xué)中一樣,Go語(yǔ)言使用后綴 i 表示復(fù)數(shù),例如 5 + 5.1i )
三、字符串
Go語(yǔ)言的字符串是用UTF-8編碼的變寬字符序列,每個(gè)字符都用一個(gè)或多個(gè)字節(jié)表示。這與Java不同,Java是采用UTF-16來(lái)表示,每個(gè)字符都對(duì)應(yīng)2個(gè)字節(jié)。
(1)創(chuàng)建:一種是用雙引號(hào)(")括起來(lái),它表示可解析的字符串,可以進(jìn)行字符轉(zhuǎn)義。另一種是用單引號(hào)(')括起來(lái),它表示原生的字符串,可以包含除反引號(hào)之外的任何字符,當(dāng)然也可以換行。如下:
復(fù)制代碼 代碼如下:
func test1() {
str1 := "\"it's me!\""
str2 := `"it's me,too"`
fmt.Println(str1)
fmt.Println(str2)
}
輸出為:
"it's me!"
"it's me,too"
(2)Go語(yǔ)言的字符串支持 “+=”操作,可以通過(guò)[n]獲取索引處的原始字節(jié)、通過(guò)[n:m]、[n:]、[:m]來(lái)獲取字節(jié)對(duì)應(yīng)的字符串,若字符被截段,顯示亂碼。如:
復(fù)制代碼 代碼如下:
func test1() {
str1 := "Go語(yǔ)言的字符串是用UTF-8編碼的變寬字符序列,每個(gè)字符都用一個(gè)或多個(gè)字節(jié)表示。"
fmt.Println(str1[4:15])
fmt.Println(str1[5:15])
fmt.Println(str1[5])
fmt.Println(str1[:5])
fmt.Println(len(str1)) //字節(jié)數(shù)
fmt.Println(len([]rune(str1))) //字符數(shù)
}
輸出為 :
�言的字�
言的字�
232
Go語(yǔ)
109
41
(3)字符串支持常規(guī)的比較運(yùn)算符操作,比較運(yùn)算符在內(nèi)存中一個(gè)字節(jié)一個(gè)字節(jié)的比較字符串。當(dāng)然了,這個(gè)比較是按照utf-8編碼的順序進(jìn)行比較的。
(4)上例的最后一個(gè)取字符數(shù)的操作:len([]rune(str1)),在Go語(yǔ)言中,一個(gè)字符串可以可以用一個(gè)rune(又名int32)數(shù)組來(lái)表示,每個(gè)rune都表示一個(gè)單一的字符。如:
復(fù)制代碼 代碼如下:
func test1() {
str1 := "Go語(yǔ)言的字符串是用UTF-8編碼的變寬字符序列,每個(gè)字符都用一個(gè)或多個(gè)字節(jié)表示。"
for _, char := range []rune(str1) {
fmt.Println(char)
}
}
這個(gè)操作會(huì)將str1的每個(gè)字符數(shù)字直接打印出來(lái)
四、指針
(1)指針的本質(zhì),用一個(gè)簡(jiǎn)單例子說(shuō)明一下:
復(fù)制代碼 代碼如下:
func test2() {
a := "xyz"
b := "opq"
pa := a //pa為指向a的指針
pp := pa //pp為指向pa的指針
fmt.Println(a, b, *pa, **pp)
a += "zz" //a追加“zz”
fmt.Println(a, b, *pa, **pp)
*pa += "bb" //pp指向的值,追加"bb"
fmt.Println(a, b, *pa, **pp)
fmt.Println("打印a各種情況:", a, a)
fmt.Println("打印pa各種情況:", pa, pa, *pa)
fmt.Println("打印pp各種情況:", pp, pp, *pp, **pp)
}
輸出如下:
xyz opq xyz xyz
xyzzz opq xyzzz xyzzz
xyzzzbb opq xyzzzbb xyzzzbb
打印a各種情況: 0xc0820001d0 xyzzzbb
打印pa各種情況: 0xc082038018 0xc0820001d0 xyzzzbb
打印pp各種情況: 0xc082038020 0xc082038018 0xc0820001d0 xyzzzbb
可見(jiàn),指針的本質(zhì)就是一個(gè)存放邏輯地址的變量。
(2)有兩種創(chuàng)建變量的語(yǔ)法,同時(shí)獲得指向它們的指針:new(Type) 和 Type{}, 如下:
復(fù)制代碼 代碼如下:
type point struct {
x int
y int
}
func test3() {
a := point{1, 2}
b := new(point)
c := point{}
d := point{3, 4}
fmt.Println(a, b, c, d)
}
輸出為:
{1 2} {0 0} {0 0} {3 4}
Go語(yǔ)言打印指向結(jié)構(gòu)體的指針時(shí),會(huì)打印解引用后的結(jié)構(gòu)體內(nèi)容,同時(shí)會(huì)將作為前綴,表示它是一個(gè)指針。
希望本文所述對(duì)大家的GO語(yǔ)言程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- GO語(yǔ)言類(lèi)型轉(zhuǎn)換和類(lèi)型斷言實(shí)例分析
- Go語(yǔ)言基礎(chǔ)知識(shí)總結(jié)(語(yǔ)法、變量、數(shù)值類(lèi)型、表達(dá)式、控制結(jié)構(gòu)等)
- GO語(yǔ)言基本數(shù)據(jù)類(lèi)型總結(jié)
- Go語(yǔ)言的方法接受者類(lèi)型用值類(lèi)型還是指針類(lèi)型?
- Go語(yǔ)言中的復(fù)合類(lèi)型詳細(xì)介紹
- 為什么Go語(yǔ)言把類(lèi)型聲明放在后面?
- Go語(yǔ)言基本的語(yǔ)法和內(nèi)置數(shù)據(jù)類(lèi)型初探
- Go語(yǔ)言中如何通過(guò)方法為類(lèi)型添加行為