1. 程式人生 > >Go的基本資料型別

Go的基本資料型別

Go語言的基礎資料型別

Go語言的資料型別主要分為四種:基礎型別(數字,字串,布林型別),複合型別(陣列,結構體),引用型別(指標,切片,字典,函式和通道),介面型別

整型

Go 語言的整型定義型別有符號型別主要有int8,int16,int32,int64, 無符號型別uint8,uint16,uint32,uint64. int 和uint 是對應硬體平臺分別對應不同的位數。以及uintptr

型別 有無符號 bit數
int8 yes 8
int16 yes 16
int32 yes 32
int64 yes 64
uint8 no 8
uint16 no 16
uint32 no 32
uint64 no 64
int yes 等於cpu位數
uint no 等於CPU的位數
byte no 等於uint8
rune yes 等同於int32
uintptr no -

Go語言的Bit操作符主要有以下幾種:

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

這些操作符大部分和C語言的沒什麼不同,在這裡說一下&^這個運算子是&和^的結合

x &^ y

這裡的意思就是y為1的位都為0,然後其餘的和x一樣。也就是先執行了^y操作然後 &x。

浮點型

  1. 浮點數表示:

Go語言定義了兩個型別float32和float64,其中float32等價於C語言的float型別,
float64等價於C語言的double型別。

在這裡普及一下float在記憶體中的儲存方式

float
共計32位,摺合4位元組
由最高到最低位分別是第31、30、29、……、0位
31位是符號位,1表示該數為負,0反之。
30-23位,一共8位是指數位。
22-0位,一共23位是尾數位。
float的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是一個隱含著的“1”,由於它是不變的,故不能對精度造成影響。
float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字。

不懂的可以參照

然後GO聖經的這個程式碼:

var f float32 = 16777216 // 1 << 24 
fmt.Println(f == f+1) // "true"!

為什麼f == f+1,其實就是精度的問題,大家可以測試一下f+3和f+4的結果應該也是一樣的,對於要捨棄的第一位(大於23位的第一位如果是1是要進位到前面去的)。

對於浮點型的比較因為是不精確的,所以不能使用==,可以使用下面的程式碼

import "math"

func Checkqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}

p是使用者自定義的精度,如:0.000001

複數

複數由兩部分組成,實部(real)和虛部(imag).Go 語言提供了complex64和complex128兩種精度。

複數的表示:

var x complex64
x = 4 + 4i
y := 4 + 4i
z := complex(4,4)

在這裡x代表是complex64型別, y,z都屬於complex128型別。

對於複數,可以通過Go語言內建的real(x)和imag(x)來分別獲取複數的實部和虛部。

布林型別

布林型別和和C語言的沒什麼區別關鍵字bool,可以賦值true 和false 。這裡不做其它講述。

字串和Byte切片

字串在任何語言裡面都是一個很好用的東西。Go語言是直接支援原生的字串型別。Go語言的字串的操作感覺很像python裡面的操作,看下面的字串操作程式碼:

func StringFunc(s string) {
    fmt.Printf("%c", s[0]) // 下標操作和傳統的C一樣
    var f string = ",wenxuwan"
    s = s + f //字串連線,可以直接+連結兩個字串
    fmt.Println(s[0:4]) //截斷操作,列印0-3下表的字串
    fmt.Println(len(s)) //列印字串的長度

}

var str string = "Hello,world"
StringFunc(str)
對於中文字元的,如果想獲取到中文字元,可以先將string轉換為rune陣列,得到中文的Unicode,然後用string將Unicode轉換為字元即可。

常量

  • 1

常量的關鍵字和C語言的一樣,都是const表示:

const i = 3.1415926

const同時支援批量宣告

const(
    a = 10
    b
    c =20
    d 
)

批量宣告除了第一個必須賦值,其它的都可以省略。你如果列印a,b,c,d的值,結果是10,10,20,20。也就保持和上面的值一樣。

  • 2

這樣看來其實const批量宣告也沒什麼大的作用,因此我們需要來介紹iota(常量生成器),它和其它語言裡面的enum是一樣的作用

const(
    first = iota
    second
    third 
    fourth
)

輸出之後,結果應該是0,1,2,3。

在這裡如果程式碼如下

const(
    first = iota
    second
    third = 10
    fourth
)

結果會是什麼?

如果是這樣,結果是什麼?

const(
    first = iota
    second
    third = 10
    fourth = iota
)

大家可以通過這個來自己感受iota的使用

這裡還有一種使用方法

const(
    first = 1 << iota
    second
    third
    fourth
)

結果大家測試一下。