1. 程式人生 > >go數據類型之基本類型

go數據類型之基本類型

bool 不可 ror ash 讀取 無符號 細節 table 需要

基本數據類型

數值型

整數

  • 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

字符型使用細節

  1. 如果保存ASCII表中的字符,保存到byte
  2. 如果保存的字符碼值overflow byte,可以考慮用int,字符型自動推導類型時就會按碼值大小選擇int32或int64
  3. 默認輸出的是字符對應的碼值,想輸出字符需要用%c
  4. 允許字符轉義,如‘\n‘表示一個換行符
  5. 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,所以設計成不可變類型

字符串兩種表示形式

  1. 使用雙引號 var name string ="Jack"

  2. 使用反引號

    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)

數據類型轉換細節:

  1. golang小轉大,大轉小,低精度到高精度,高精度轉低精度都要強制類型轉換
  2. 被轉換的是變量中保存的數據值,變量本身的數據類型不變,就像函數中的值傳遞
  3. 大轉小時,比如int64一個比較大的數轉int8,不會報錯但是也不是希望的結果,會按溢出處理,轉換時註意數據類型的取值範圍
  4. 兩個範圍、精度不同的數據在一個表達式中運算時,結果是其中範圍大,精度高的一個

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數據類型之基本類型