我這邊先把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個字節的,如果創建了很多這樣的變量,很可能會造成一些空間的浪費,因此,具體使用什麼類型的變量,還是要根據不同情況不同分析。