GO學習筆記——GO基本數據類型(4)

我這邊先把GO語言中的數據類型都快速梳理出來,爲了和C++有一個對比,有了數據類型,纔有後面對變量和常量的一些定義。

整型

序號

類型

描述

1

uint8

無符號8位整型(0-2^8 - 1),1個字節

2

uint16

無符號16位整型(0-2^16 - 1),2個字節

3

uint32

無符號32位整型(0-2^32 - 1),4個字節

4

uint64

無符號64位整型(0-2^64 - 1),8個字節

5

int8

有符號8位整型(-2^7 - 2^7 - 1),1個字節

6

int16

有符號16位整型(-2^15 - 2^15 - 1),2個字節

7

int32

有符號32位整型(-2^31 - 2^31 - 1),4個字節

8

int64

有符號64位整型(-2^63 - 2^63 - 1),8個字節

浮點和複數類型(浮點型只有這兩種類型,float64相當於C++裏的double)

序號

類型

描述

1

float32

32位浮點型數

2

float64

64位浮點型數

3

complex64

32位實數和虛數

4

complex128

64位實數和虛數

其他整型數據類型

序號

類型

描述

1

byte

字節類型,類似uint8

2

rune

類似int32,用來表示字符類型(也是C++裏的char,只不過這裏的rune不像char一樣是1個字節8位了,而是4個字節32位,主要是爲了多種字符類型共通性,比如utf-8字符集中很多字符是2字節,也有3字節的

3

uint

32位或64位無符整型(也就是C++裏平時常用的unsigned int,具體幾位看32位平臺還是64位平臺

4

int

32位或64位有符號整型(也就是C++裏平時常用的int,具體幾位看32位平臺還是64位平臺

5

uintptr

無符號整型,用於存放一個指針,GO語言中也有指針

布爾型(bool),這個類型只有兩個值true和false,而且注意的一點是,GO不像C++,C++中bool類型可以用1或0來表示true和flase,比如在一個if語句的條件中,它希望接收的是一個布爾表達式,但是我們可以直接用一個數值1或大於0的數來表示true,數值0或小於0的數來表示false。而在GO語言中則不可以這樣賦值。

func main() {
	var b bool = 1
}

在編譯期間,編譯器就直接報錯了,所以這一點是需要注意的地方。

.\main.go:5:6: cannot use 1 (type int) as type bool in assignment

另外還有string類型,C++中string是當作一個類來使用的,在命名空間std中的(std::string),而GO語言是直接將string設定爲了一個內置類型。

另外GO語言對於字符的統一編碼格式是utf-8。

 

強制類型轉換

之前說過GO語言是一個強類型語言,變量的使用必須聲明類型。而變量的類型轉換也是強制的,沒有像C++這樣的有隱式類型轉換。

來看下面這樣一段C++代碼

int func(double a){
    return a;
}

int main(){
    int a = 1;
    cout << func(a)  << endl;
    return 0;
}

這邊給了一個函數func,它接收的參數是一個double類型,返回類型是一個int類型。這邊函數內部直接將這個double類型的參數作爲返回值返回了,這裏就有一個隱式類型轉換,把double類型隱式轉換成了int類型來返回。

而在傳參的時候,我是用一個int類型作爲參數傳進去的,也發生了隱式類型轉換,將int類型隱式轉化成了double類型。

所以在C++中,隱式類型轉化是允許的。但是,GO就不同了。

func add(a float64,b float64) int {
	return a + b
}

func main() {
	var a,b float64 = 1.0,2.1
	fmt.Println(add(a,b))
}

上述函數中,函數add的返回值是一個int,而我們直接將兩個float64參數相加的結果直接返回了,它的結果還是一個float64,我們想讓它能像C++一樣發生隱式類型轉換,但是不行,因爲GO只允許強制類型轉換,所以上面的代碼,編譯器肯定會報如下錯誤。

.\main.go:6:11: cannot use a + b (type float64) as type int in return argument

如果我們用了強制類型轉換,上述代碼就可以通過

func add(a float64,b float64) int {
	return int(a + b)    //強制類型轉換
}

func main() {
	var a,b float64 = 1.0,2.1
	fmt.Println(add(a,b))
}

因此,程序輸出了下面代碼

3    //本來是3.1,這裏會失去精度,從浮點型變成了整型,所以輸出了3

所以需要注意的是,GO只支持強制類型轉換,不支持隱式類型轉換!

另外,強制類型轉換隻能發生在兩個兼容類型之間,比如int和float64就是兩個兼容類型,而int和string之間就不可以發生強制類型轉換了

 

好了,再注意一個問題,我們平時用int用的比較多,但如果你的機器是64位的,在GO語言中你創建一個int類型的變量就是一個int64的變量,是8個字節的,如果創建了很多這樣的變量,很可能會造成一些空間的浪費,因此,具體使用什麼類型的變量,還是要根據不同情況不同分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章