這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Go語(yǔ)言數(shù)據(jù)類(lèi)型有哪些,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了克什克騰免費(fèi)建站歡迎大家使用!
類(lèi)型描述uint32位或64位uint8無(wú)符號(hào) 8 位整型 (0 到 255)uint16無(wú)符號(hào) 16 位整型 (0 到 65535)uint32無(wú)符號(hào) 32 位整型 (0 到 4294967295)uint64無(wú)符號(hào) 64 位整型 (0 到 18446744073709551615)int32位或64位int8有符號(hào) 8 位整型 (-128 到 127)int16有符號(hào) 16 位整型 (-32768 到 32767)int32有符號(hào) 32 位整型 (-2147483648 到 2147483647)int64有符號(hào) 64 位整型 (-9223372036854775808 到 9223372036854775807)byteuint8的別名(type byte = uint8)runeint32的別名(type rune = int32),表示一個(gè)unicode碼uintptr無(wú)符號(hào)整型,用于存放一個(gè)指針是一種無(wú)符號(hào)的整數(shù)類(lèi)型,沒(méi)有指定具體的bit大小但是足以容納指針。
uintptr類(lèi)型只有在底層編程是才需要,特別是Go語(yǔ)言和C語(yǔ)言函數(shù)庫(kù)或操作系統(tǒng)接口相交互的地方。float32IEEE-754 32位浮點(diǎn)型數(shù)float64IEEE-754 64位浮點(diǎn)型數(shù)complex6432 位實(shí)數(shù)和虛數(shù)complex12864 位實(shí)數(shù)和虛數(shù)
整型數(shù)據(jù)分為兩類(lèi),有符號(hào)和無(wú)符號(hào)兩種類(lèi)型。
有符號(hào):int, int8, int16, int32, int64
無(wú)符號(hào):uint, uint8, uint16, uint32, uint64, byte
不同位數(shù)的整型區(qū)別在于能保存整型數(shù)字范圍的大??;
有符號(hào)類(lèi)型可以存儲(chǔ)任何整數(shù),無(wú)符號(hào)類(lèi)型只能存儲(chǔ)自然數(shù)
int和uint的大小和系統(tǒng)有關(guān),32位系統(tǒng)表示int32和uint32,如果是64位系統(tǒng)則表示
int64和uint64
byte與uint8類(lèi)似,一般用來(lái)存儲(chǔ)單個(gè)字符
在保證程序正確運(yùn)行下,盡量使用占用空間小的數(shù)據(jù)類(lèi)型
fmt.Printf("%T", var_name)輸出變量類(lèi)型
unsafe.Sizeof(var_name)查看變量占用字節(jié)
浮點(diǎn)型也就是小數(shù)類(lèi)型,可以存放小數(shù)。比如6.6,-12.34
關(guān)于浮點(diǎn)數(shù)在機(jī)器中存放形式的簡(jiǎn)單說(shuō)明,浮點(diǎn)數(shù)=符號(hào)位+指數(shù)位+尾數(shù)位
尾數(shù)部分可能丟失,造成精度損失。-123.0000901
package main import "fmt" func main() { var num1 float32 = -123.0000901 var num2 float64 = -123.0000901 fmt.Println("num1 = ", num1, "num2 = ", num2); }
說(shuō)明:float64的精度要比f(wàn)loat32的要準(zhǔn)確說(shuō)明:如果我們要保存一個(gè)精度高的數(shù),則應(yīng)該選擇float64浮點(diǎn)型的存儲(chǔ)分為三部分:符號(hào)位+指數(shù)位+尾數(shù)位,在存儲(chǔ)過(guò)程中,精度會(huì)有丟失golang的浮點(diǎn)型默認(rèn)為float64類(lèi)型通常情況下,應(yīng)該使用float64,因?yàn)樗萬(wàn)loat32更精確0.123可以簡(jiǎn)寫(xiě)成.123,也支持科學(xué)計(jì)數(shù)法表示:5.1234e2 等價(jià)于512.34
Golang中沒(méi)有專(zhuān)門(mén)的字符類(lèi)型,如果要存儲(chǔ)單個(gè)字符(字母),一般使用byte來(lái)保存。字符串就是一串固定長(zhǎng)度的字符連接起來(lái)的字符序列。Go的字符串是由單個(gè)字節(jié)連接起來(lái)的,也就是說(shuō)對(duì)于傳統(tǒng)的字符串是由字符組成的,而Go的字符串不同,它是由字節(jié)組成的。
字符只能被單引號(hào)包裹,不能用雙引號(hào),雙引號(hào)包裹的是字符串當(dāng)我們直接輸出type值時(shí),就是輸出了對(duì)應(yīng)字符的ASCII碼值當(dāng)我們希望輸出對(duì)應(yīng)字符,需要使用格式化輸出Go語(yǔ)言的字符使用UTF-8編碼,英文字母占一個(gè)字符,漢字占三個(gè)字符在Go中,字符的本質(zhì)是一個(gè)整數(shù),直接輸出時(shí),是該字符對(duì)應(yīng)的UTF-8編碼的碼值??梢灾苯咏o某個(gè)變量賦一個(gè)數(shù)字,然后按格式化輸出時(shí)%c,會(huì)輸出該數(shù)字對(duì)應(yīng)的unicode字符字符類(lèi)型是可以運(yùn)算的,相當(dāng)于一個(gè)整數(shù),因?yàn)樗鼈兌加袑?duì)應(yīng)的unicode碼
package main import "fmt" func main() { //字符只能被單引號(hào)包裹,不能用雙引號(hào),雙引號(hào)包裹的是字符串 var c1 byte = 'a' var c2 byte = '0' //當(dāng)我們直接輸出type值時(shí),就是輸出了對(duì)應(yīng)字符的ASCII碼值 //'a' ==> 97 fmt.Println(c1, "--", c2) //如果我們希望輸出對(duì)應(yīng)字符,需要使用格式化輸出 fmt.Printf("c2 = %c c2 = %c", c1, c2) }
但是如果我們保存的字符大于255,比如存儲(chǔ)漢字,這時(shí)byte類(lèi)型就無(wú)法保存,此
時(shí)可以使用uint或int類(lèi)型保存
字符型存儲(chǔ)到計(jì)算機(jī)中,需要將字符對(duì)應(yīng)的碼值(整數(shù))找出來(lái)存儲(chǔ):字符 --> 碼值 --> 二進(jìn)制 --> 存儲(chǔ)讀取: 二進(jìn)制 -->碼值 --> 字符 --> 讀取字符和碼值的對(duì)應(yīng)關(guān)系是通過(guò)字符編碼表決定的(是規(guī)定好的)Go語(yǔ)言的編碼都統(tǒng)一成了UTF-8。非常的方便,很統(tǒng)一,再也沒(méi)有編碼亂碼的困擾了
布爾類(lèi)型也叫做bool類(lèi)型,bool類(lèi)型數(shù)據(jù)只允許取值true或falsebool類(lèi)型占1個(gè)字節(jié)bool類(lèi)型適用于邏輯運(yùn)算,一般用于流程控制
字符串就是一串固定長(zhǎng)度的字符連接起來(lái)的字符序列。Go的字符串是由單個(gè)字節(jié)連接起來(lái)的。Go語(yǔ)言的字符串的字節(jié)使用UTF-8編碼標(biāo)識(shí)Unicode文本
字符串一旦賦值了,就不能修改了:
字符串的兩種標(biāo)識(shí)形式
雙引號(hào),會(huì)識(shí)別轉(zhuǎn)義字符
var str = "abc\nabc" //輸出時(shí)會(huì)換行
反引號(hào),以字符串的原生形式輸出,包括換行和特殊字符,可以實(shí)現(xiàn)防止攻擊、輸出源代碼等效果
var str string = `abc\nabc` //輸出時(shí)原樣輸出,不會(huì)轉(zhuǎn)義
字符串拼接方式"+"
var str string = "hello " + "world" str += "!"
當(dāng)一行字符串太長(zhǎng)時(shí),需要使用到多行字符串,可以使用如下處理
//正確寫(xiě)法 str := "hello" + " world!" fmt.Println(str) //錯(cuò)誤寫(xiě)法 str := "hello " + "world!" fmt.Println(str)
基本數(shù)據(jù)類(lèi)型,變量存的就是值,也叫值類(lèi)型獲取變量的地址,用&,比如var num int,獲取num的地址:&num指針類(lèi)型,指針變量存的是一個(gè)地址,這個(gè)地址指向的空間存的才是值,比如:var ptr *int = &num獲取指針類(lèi)型所指向的值,使用:*,比如,var ptr *int,使用*ptr獲取ptr指向的值
指針細(xì)節(jié)說(shuō)明:
值類(lèi)型,都有對(duì)應(yīng)的指針類(lèi)型,形式為
,比如int對(duì)應(yīng)的指針就是*int,float64對(duì)應(yīng)的指針類(lèi)型就是*float64,依此類(lèi)推。值類(lèi)型包括:
、
和
值類(lèi)型和引用類(lèi)型使用特點(diǎn):值類(lèi)型:變量直接存儲(chǔ)值,內(nèi)存通常在棧中分配引用類(lèi)型:變量存儲(chǔ)的是一個(gè)地址,這個(gè)地址對(duì)應(yīng)的空間才真正存儲(chǔ)數(shù)據(jù)(值),內(nèi)存通常在堆上分配,當(dāng)沒(méi)有任何變量應(yīng)用這個(gè)地址時(shí),該地址對(duì)應(yīng)的數(shù)據(jù)空間就成為一個(gè)垃圾,由GC來(lái)回收。Golang中值類(lèi)型和引用類(lèi)型的區(qū)分
值類(lèi)型:基本數(shù)據(jù)類(lèi)型(int系列、float系列、bool、string)、數(shù)組和結(jié)構(gòu)體引用類(lèi)型:指針、slice切片、map、管道chan、interface等都是引用類(lèi)型
在Golang中,數(shù)據(jù)類(lèi)型都有一個(gè)默認(rèn)值,當(dāng)程序員沒(méi)有賦值時(shí),就會(huì)保留默認(rèn)值,在Golang中,默認(rèn)值也叫做零值?;緮?shù)據(jù)類(lèi)型默認(rèn)值如下:數(shù)據(jù)類(lèi)型默認(rèn)值整型0浮點(diǎn)型0字符串""布爾類(lèi)型false
package main import "fmt" func main() { var a int var b float32 var isTrue bool var str string //這里的%v,表示按照變量的值輸出 fmt.Printf("a = %v, b = %v, isTrue = %v, str = %v", a, b, isTrue, str) fmt.Println("") }
Golang和Java/C不同,Golang在不同類(lèi)型的變量之間賦值時(shí)需要顯式轉(zhuǎn)換。也就是Golang中數(shù)據(jù)類(lèi)型不能自動(dòng)轉(zhuǎn)換?;菊Z(yǔ)法:表達(dá)式var_type(var_name) 將值v轉(zhuǎn)換為類(lèi)型var_typevar_type:就是數(shù)據(jù)類(lèi)型,比如int32, int64, float32等等var_name:就是需要轉(zhuǎn)換的變量
var num int = 42 var float float64 = float64(num) var ui uint8 = uint8(float) fmt.Println(num, float, ui)
Go中,數(shù)據(jù)類(lèi)型的轉(zhuǎn)換可以是從表示范圍小-->表示范圍大,也可以 范圍大—>范圍小被轉(zhuǎn)換的是
(即值),變量本身的數(shù)據(jù)類(lèi)型并沒(méi)有變化!在轉(zhuǎn)換中,比如將int64轉(zhuǎn)成int8,編譯時(shí)不會(huì)報(bào)錯(cuò),只是轉(zhuǎn)換的結(jié)果是按溢出處理,和我們希望的結(jié)果不一樣。數(shù)據(jù)的轉(zhuǎn)換必須顯式轉(zhuǎn)換,不能自動(dòng)轉(zhuǎn)換
package main import "fmt" func main() { var n1 int32 = 12 var n2 int64 var n3 int8 n2 = n1 + 20 //int32 --> int64 錯(cuò)誤 n3 = n1 + 20 //int32 --> int8 錯(cuò)誤 n2 = int64(n1) + 20 //正確 n3 = int8(n1) + 20 //正確 }
定義一個(gè)int8類(lèi)型的整數(shù)(var num int8 = 0),如果一直自加1,這個(gè)變量的值會(huì)是(0...127 -128 -127... 0 ...127)循環(huán)往復(fù)下去,而不會(huì)超過(guò)類(lèi)型最大值的范圍
在程序開(kāi)發(fā)中,我們經(jīng)常需要將數(shù)值型轉(zhuǎn)成string類(lèi)型,或者將string類(lèi)型轉(zhuǎn)成數(shù)值
型。
方式1:
func Sprintf(format string, a ...interface{}) string
Sprintf根據(jù)format參數(shù)生成格式化的字符串并返回該字符串。
package main import "fmt" func main() { var num1 int = 99; var num2 float64 = 23.456 var isTrue bool = true var char byte = 'A' var str string str = fmt.Sprintf("%d", num1) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) str = fmt.Sprintf("%f", num2) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) str = fmt.Sprintf("%t", isTrue) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) str = fmt.Sprintf("%d", char) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) }
輸出結(jié)果為
str類(lèi)型為 string str = "99" str類(lèi)型為 string str = "23.456000" str類(lèi)型為 string str = "true" str類(lèi)型為 string str = "65"
方式2:使用strconv包的函數(shù)
package main import ( "fmt" "strconv" ) func main() { var num1 int = 99; var num2 float64 = 23.456 var isTrue bool = true var str string str = strconv.FormatInt(int64(num1), 10) str = strconv.Itoa(num1) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) str = strconv.FormatFloat(num2, 'f', 10, 64) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) str = strconv.FormatBool(isTrue) fmt.Printf("str類(lèi)型為 %T str = %q\n",str, str) }
輸出結(jié)果為
str類(lèi)型為 string str = "99" str類(lèi)型為 string str = "23.4560000000" str類(lèi)型為 string str = "true"
方式1:使用strconv包的函數(shù)
package main import ( "fmt" "strconv" ) func main() { var str string = "true" var str1 string = "123456" var str2 string = "123.456" var isTrue bool var num int64 var num2 float64 isTrue, _ = strconv.ParseBool(str) fmt.Printf("str類(lèi)型為 %T str = %v\n",isTrue, isTrue) num, _ = strconv.ParseInt(str1, 10, 64) fmt.Printf("str類(lèi)型為 %T str = %v\n",num, num) num2, _ = strconv.ParseFloat(str2, 64) fmt.Printf("str類(lèi)型為 %T str = %v\n",num2, num2) }
數(shù)據(jù)結(jié)果為:
str類(lèi)型為 bool str = true str類(lèi)型為 int64 str = 123456 str類(lèi)型為 float64 str = 123.456
注意:在將string類(lèi)型轉(zhuǎn)成其它基本數(shù)據(jù)類(lèi)型時(shí),要確保string類(lèi)型能夠轉(zhuǎn)成有效的數(shù)據(jù)。比如,我們可以把”123“轉(zhuǎn)成數(shù)字123,但是不能把”hello“轉(zhuǎn)成一個(gè)整數(shù),如果這樣做,Golang直接將其轉(zhuǎn)成0,其它類(lèi)型也是一樣的道理,float => 0, bool=>false
上述就是小編為大家分享的Go語(yǔ)言數(shù)據(jù)類(lèi)型有哪些了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。