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