1. 程式人生 > 實用技巧 >go基礎2-基礎資料型別

go基礎2-基礎資料型別

資料型別

所有資料在底層上都是由位元組成,但是通過語言封裝資料型別,可以兼顧硬體的特性和表達賦值資料的便捷性;

go將資料型別分為四類:基礎型別,複合型別,引用型別和介面型別.

基礎型別:數值,字串,布林型;
複合型別:陣列,結構體
引用型別:指標,切片,字典,函式,通道
介面型別:介面

基礎型別

  • 整型

數值型別包括:幾種不同大小的整數,浮點數,複數.每種數值型別都決定了記憶體佔用和是否支援正負符號.

整型資料型別:int8,int16,int32,int64(有符號);uint8,uint16,uint32,uint64(無符號)

Unicode字元rune型別int32,通常用於表示一個Unicode碼點;
byte

uint8型別,一般強調數值時一個原始資料而不是小整數;
uintptr:無符號整數型別,未指定具體的bit大小但足以容納指標;

不管它們的具體大小,int,uint,uintprt是不同型別的兄弟型別,同時使用時需要顯示型別轉換;

下面時關於算術運算,邏輯運算,比較運算的二元運算子,按優先順序遞減排序:

*      /      %      <<       >>     &       &^
+      -      |      ^
==     !=     <      <=       >      >=
&&
||

使用括號可以提高優先順序.

算術運算子+-*/可以適用於整數,浮點數,複數,但取模運算子%僅用於整數

如果實際儲存資料超過分配大小,會造成資料溢位,超出高位的bit位部分將被丟棄.

位操作運算子:

&      位運算 AND
|      位運算 OR
^      位運算 XOR
&^     位清空(AND NOT)
<<     左移
>>     右移

其中是按位取反;&是按位清空,x&^y:如果y為1,則位結果為0,如果y=0,則結果為等於x;

型別轉換基礎是相同的底層資料結構,轉換隻改變佔空間大小,這就意味著大型別轉小型別會造成改變數值或丟失精度.

  • 浮點數

go有兩種浮點數:float32,float64.

  • 複數

包含兩種精度的複數型別:complex64,complex128,分別對應float32,float64;內建的complex函式用於構建複數,內建的real,imag函式分別返回複數的實部和虛部;

複數的值=RE + IMi.RE:實數部分;IM:虛數部分;i:虛數單位;RE,IM均為float型別;

複數宣告語法:var name complex128 = complex(x, y)

name:複數變數名;complex128:複數型別;complex是go的內建函式用於為複數賦值;x,y分別表示構成該複數float64型別的數值,x為實部,y為虛部;

  • 布林型

有兩個值:true,false;

&&,||用於條件連線,同時還具備短路行為.&&優先順序高於||;

  • 字串

字串是一個不可改變的位元組序列,可以包含任意資料,但通常是人類可讀的文字.文字字串通常是採用UTF8編碼的Unicode碼點(rune)序列.

空間佔用:ASCII字元佔用一個位元組,其他的要佔用兩個或多個位元組;

字串是不可變的,你不能直接替換原本字串中的部分資料.不變性意味著兩個字串共享相同的底層資料的話也是安全的,這也使得任意長度的字串使用成本比較低,子集和父集可以共享一個字串.

字串使用特殊字元:

轉義方式
\a      響鈴
\b      退格
\f      換頁
\n      換行
\r      回車
\t      製表符
\v      垂直製表符
\'      單引號(只用在 '\'' 形式的rune符號面值中)
\"      雙引號(只用在 "..." 形式的字串面值中)
\\      反斜槓

特殊字元使用還可以通過進位制轉換獲取:

十六進位制:\xhh    
八進位制: \ooo

還可以通過:反引號``進行原樣輸出來使用特殊字元.

Unicode碼點:

由於網際網路從美國走向了全球,原來的ASCII只包含了英文的文字無法滿足其他語言的文字需求,所以就進行了文字擴充,來實現網路文字的跨地區適配.

UTF8

UTF8是將Unicode編碼為位元組序列的變長編碼.它使用1到4位元組來表示每個Unicode碼點,ASCII部分字元只使用一個位元組,常用字元部分使用2或3位元組表示.每個符號編碼後第一個位元組的高階bit位用於表示編碼總共有多少個位元組.

0xxxxxxx                             runes 0-127    (ASCII)
110xxxxx 10xxxxxx                    128-2047       (values <128 unused)
1110xxxx 10xxxxxx 10xxxxxx           2048-65535     (values <2048 unused)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  65536-0x10ffff (other values unused)

常用字串庫:bytes,strings,strconv,unicode包

strings:字串查詢,替換,比較,截斷,拆分和合並等功能;
bytes:字串分配和複製
strconv:布林型,整型數,浮點數和字串轉換
unicode:提供rune字元相關功能函式,如區分字元數字,字母大小寫轉換等.

  • 常量

常量是執行期間不會變化的量,它的值在編譯期計算.可以防止在執行期被意外或惡意修改.

常量的賦值和變數宣告類似,常量的宣告語句定義了:常量標識,常量名,型別和值;每種常量的潛在型別都是基礎型別:boolean,string或數值;

    const pi = 3.14159
    // 多個常量定義
    const (
        e = 2.718
        pi = 3.14159
    )

常量的運算在編譯期完成,減少了執行期工作,編譯提前發現問題,也便於編譯優化.
常量間的所有算數運算,邏輯運算,比較運算的結果也是常量,對常量的型別轉換或以下函式呼叫返回的也是常量結果:

len,cap,real,imag,complex,unsafe.Sizeof

未指明型別的常量,會自動進行型別推定;批量常量宣告,可以通過前一個常量的定義值,進行值傳遞

iota常量生成器

它用於生成一組相似規則初始化的常量,但是不用每行都寫一遍初始化表示式.在一個const宣告語句中,在第一個宣告的常量所在行,iota將會被置為0,然後每個後續常量宣告進行加一;

type Weekday int

const (
    Sunday Weekday = iota //0
    Monday                  //1
    Tuesday                  //2
    Wednesday
    Thursday
    Friday
    Saturday
)

無型別常量

go的常量可以分為有型別常量和無型別常量,無型別常量可以提供更高精度的算術運算和直接用於多種表示式而不用顯示型別轉換.
無型別常量可以分為:無型別布林型,無型別整數,無型別字元,無型別浮點數,無型別複數,無型別字串

var x float32 = math.Pi
var y float64 = math.Pi
var z complex128 = math.Pi

如果已經將無型別變數賦值給特定型別變數,其他型別使用時就要進行型別轉換(顯示或隱式);
只有常量可以是無型別的.變數沒有顯示型別宣告時,常量的形式將隱式決定變數的型別;
無型別整數常量轉為int,它的記憶體大小是不確定的,但無型別浮點數和複數常量則轉換未記憶體大小明確的float64,complex128.這是因為如果不知道浮點數的記憶體大小河南寫出正確的數值演算法.