Go程式語言2 5 型別宣告

2021-09-23 16:27:30 字數 1539 閱讀 1059

2.5 型別宣告

變數或表示式的型別定義這些值應有的特性,例如大小(多少位或多少個元素等)、在內部如何表達、可以對其進行何種操作以及它們所關聯的方法。

任何程式中,都有一些變數使用相同的表示方式,但是含義相差非常大。例如,int型別可以用於表示迴圈的索引、時間戳、檔案描述符或月份;float64型別可以表示每秒多少公尺的速度或精確到幾位小數的溫度;string型別可以表示密碼或者顏色的名字。

type宣告定義乙個新的命名型別,它和某個已有型別使用同樣的底層型別。命名型別提供了一種方式來區分底層型別的不同或者不相容使用,這樣它們就不會在無意中混用。

型別的宣告通常出現在包級別,這裡命名的型別在整個包中可見,如果名字是匯出的(開頭使用大寫字母),其他的包也可以訪問它。

為了說明型別宣告,我們把不同計量單位的溫度值轉換為不同的型別:

這個包定義了兩個型別——celsius(攝氏溫度)和fahrenheit(華氏溫度),它們分別對應兩種溫度計量單位。即使使用相同的底層型別float64,它們也不是相同的型別,所以它們不能使用算術表示式進行比較和合併。區分這些型別可以防止無意間合併不同計量單位的溫度值;從float64轉換為celsius(t)或fahrenheit(t)需要顯式型別轉換。celsius(t)和fahrenheit(t)是型別轉換,而不是函式呼叫。它們不會改變值和表達方式,但改變了顯式意義。另一方面,函式ctof和ftoc用來在兩種溫度計量單位之間轉換,返回不同的數值。

對於每個型別t,都有乙個對應的型別轉換操作t(x)將值x轉換為型別t。如果兩個型別具有相同的底層型別或二者都是指向相同底層型別變數的未命名指標型別,則二者是可以相互轉換的。型別轉換不改變型別值的表達方式,僅改變型別。如果x對於型別t是可賦值的,型別轉換也是允許的,但是通常是不必要的。

數字型別間的轉換,字串和一些slice型別間的轉換是允許的,我們將在下一章詳細討論。這些轉換會改變值的表達方式。例如,從浮點型轉化為整型會丟失小數部分,從字串轉換成位元組(byte)slice會分配乙份字串資料副本。任何情況下,執行時的轉換不會失敗。

命名型別的底層型別決定了它的結構和表達方式,以及它支援的內部操作集合,這些內部操作與直接使用底層型別的情況相同。正如你所預期的,它意味著對於celsius和fahrenheit型別可以使用與float64相同的算術操作符。

通過==和《之類的比較操作符,命名型別的值可以與其相同型別的值或者底層型別相同的未命名型別的值相比較。但是不同命名型別的值不能直接比較:

注意最後一種情況。無論名字如何,型別轉換celsius(f)沒有改變引數的值,只改變其型別。測試結果是真,因為c和f的值都是0。

命名型別提供了概念上的便利,避免一遍遍地重複寫複雜的型別。當底層型別是像float64這樣簡單的型別時,好處就不大了,但是對於我們將討論到的複雜結構體型別,好處就很大,在討論結構體時將介紹這一點。

下面的宣告中,celsius引數c出現在函式名字前面,名字叫string的方法關聯到celsius型別,返回c變數的數字值,後面跟著攝氏溫度的符號℃。

很多態別都宣告這樣乙個string方法,在變數通過fmt包作為字串輸出時,它可以控制型別值的顯示方式,我們將在7.1節中看到。

go語言學習筆記 6 型別 基礎型別

基礎型別 bool int8 byte int16 int uint uintptr float32 float64 complex64 complex128 複數 string rune 字元 error 錯誤 bool true false 整型 int8 1byte uint8 1byte i...

C語言 01 型別總結

c語言的資料型別分為基本資料型別 構造型別 指標型別 列舉型別和空型別等幾種。一 基本資料型別 1.1 整型int 1 short int short 佔2個位元組,佔位符 d i 2 long int long 佔8個位元組,佔位符 ld 3 signed int signed 佔4個位元組,佔位...

Swift程式語言學習1 3 型別安全和投機型

swift 是型別安全 type safe 語言。型別安全的語言可以讓你清楚地知道 被處理值型別。假設你需要乙個 string。你絕對不能進去乙個不小心傳球int。因為 swift 它是型別安全,因此,這將是型別檢查的編譯 type checks 並把不匹配的型別標記為錯誤。這能夠讓你在開發的時候盡...