go數據類型之基本類型
基本數據類型
數值型
整數
- int 64位操作系統默認為int64,32位操作系統為int32,但是類型檢查時時int
- int8 (byte 1字節)
- int16 (short 2字節)
- int32 (int 4字節)
- int64 (long 8字節)
uint uint8 uint16 uint32 uint64 代表無符號int 無符號只能表示正數
無符號的表示範圍更大,因為表示數值得位多1
int8
-2^(8-1) ~ 2^(8-1) -1
uint8
0~ 2^8
整數使用的細節
根據需求使用int,uint,比如表示人的年齡用uint比int好
自動推導整數就是int,比如 a:=2 這裏a是int,在64位操作系統中就是int64
保小不保大,在確保程序正確運行情況下,盡量使用占用空間較小的數據類型,比如人的年齡 uint8,0到255足夠
bit是計算機中最小存儲單位
byte是計算機中基本存儲單元 1byte=8bit
查看變量數據類型及占用字節大小
package main import ( "fmt" "unsafe" ) func main() { n1 := 12 var n2 int64 = 666 fmt.Printf("n1 type is %T, 占用字節數:%d \n", n1,unsafe.Sizeof(n1)) fmt.Printf("n1 type is %T, 占用字節數:%d \n", n2,unsafe.Sizeof(n2)) } // 輸出結果 n1 type is int, 占用字節數:8 n1 type is int64, 占用字節數:8
浮點數
- float32 (4字節 float)
- float64 (8字節 double)
浮點數都是有符號的,註意沒有float,只有float32和float64
浮點數=符號位+指數位+尾數位
尾數位可能丟失,造成精度損失
float64比float32表示的範圍更大精度更高
浮點數使用細節
golang的浮點數有固定的範圍和字段長度,不受具體os的影響
默認聲明為float64
通常使用float64,因為精度高,開發中推薦使用float64
浮點數的科學計數法
4.223E2
=4.223* 10的2次方
E可以用小寫e代替
4.251E-2
=4.251*10的-2次方
字符型
golang沒有專門的char類型,一般用單個byte保存單個字母字符
1byte=8bit 一般說是8位
UTF-8編碼中:1個英文字符或英文標點占1byte
1個中文漢字或一個中文標點占3byte
1byte不能存中文字符,utf8編碼中一個漢字需要3字節
func main() {
var c3 byte = ‘狗‘
fmt.Println(c3)
}
// 編譯報錯
# command-line-arguments
.\main.go:12:16: constant 29399 overflows byte
// 字符‘狗‘unicode碼值是29399,byte的範圍-128~127,所以overflows byte
// 想要保存中文字符怎麽辦? 用更大的數據類型 比如int
var cc int = ‘狗‘
// Println(cc) 輸出的是碼值 29399 想輸出字符需要Printf("%c",cc)
//-----------自動推導
c4 := ‘狗‘
fmt.Printf("%c,%d byte,type is %T",c4, unsafe.Sizeof(c4), c4)
// -------------輸出結果----
狗,4 byte,type is int32
字符型使用細節
- 如果保存ASCII表中的字符,保存到byte
- 如果保存的字符碼值overflow byte,可以考慮用int,字符型自動推導類型時就會按碼值大小選擇int32或int64
- 默認輸出的是字符對應的碼值,想輸出字符需要用
%c
- 允許字符轉義,如
‘\n‘
表示一個換行符 - golang中的字符本質是一個整數,可以進行運算,如
‘A‘+23
字符型數據存儲和讀取過程
存儲:字符 ->查碼表 ->獲取碼值->將碼值轉二進制 ->保存
讀取:二進制數據 ->轉碼值 ->查碼表 -> 字符
布爾型
bool 類型的值只有true 和 false
bool占用1byte
bool用於邏輯判斷
與int不兼容 不能轉數字類型
字符串
其他語言的中:一串固定長度的字符連接起來的字符序列稱為字符串,由字符(char)組成
golang字符串由單個字節連接起來構成的,由字節(byte)組成
str := "國際歌"
fmt.Println(len(str)) // 長度是9 java/python/js中長度是3
java的字符串是一個char數組,但是golang是沒有char的
string在go中屬於基本數據類型
不可變類型,字符串在各種編程語言中都是不可變的,因為字符使用場景太多,作為函數參數,hash表的key
等需求要求字符串高效、安全,可hash,所以設計成不可變類型
字符串兩種表示形式
使用雙引號
var name string ="Jack"
使用反引號
var Message = `I can not love \n golang\t any more!` // 反引號中的字符串是原始字符串,就像python中的 r" something "
字符串使用細節
字符串拼接:
msg :="hello"+"world"
msg+="!!!!"
多行字符串拼接時+
號必須放在行尾,而不是下一行的行首
info := "asjdkljflskdf"+"adsfasdf"+
"xxxx"
不常用的幾種基本類型
- uintptr 比uint64大的無符號整型
- rune int32的別名 用unicode碼值保存
- complex64 complex128
基本數據類型的默認值
定義一個變量,未賦值,這個變量有默認值,這個值也稱為零值。
DATA TYPE | DEFAULT VALUE |
---|---|
int | 0 |
float | 0.0 |
string | "" |
bool | false |
數值型相互轉換
golang中的數據類型轉換必須顯示轉換,沒有自動轉換
不像Java中小轉大,低精度轉高精度能自動轉型
類型轉換基本語法:T(v)
將變量v強制轉換為T類型
var i int32 = 666
var f float32 = float32(i)
數據類型轉換細節:
- golang小轉大,大轉小,低精度到高精度,高精度轉低精度都要強制類型轉換
- 被轉換的是變量中保存的數據值,變量本身的數據類型不變,就像函數中的值傳遞
- 大轉小時,比如int64一個比較大的數轉int8,不會報錯但是也不是希望的結果,會按溢出處理,轉換時註意數據類型的取值範圍
- 兩個範圍、精度不同的數據在一個表達式中運算時,結果是其中範圍大,精度高的一個
string的類型轉換
方式1:
fmt.Sprintf("%參數", 表達式) // 字符串格式化
// %c char
// %t bool
// %d 十進制整數
// %f 浮點數
方式2:
// 使用strconv包的函數
func FormatBool(b bool) string
func FormatInt(i int64, base int) string
func FormatUint()
func FormatFloat(f float64,fmt byte,prec,bitSize int)string
// 十進制 Atoi s->int Itoa int->s
// 字符串轉其他 失敗時有默認值
func ParseBool(str string)(value bool,err error)
func ParseInt(s string, base int, bitSize int)(i int64,err error )
func ParseUint()
func ParseFloat(s string, bitSize int)(f float64,err error)
go數據類型之基本類型