#私藏項目實操分享# Go 語言入門很簡單 -- 2. Go 的數據類型
數據類型
數據類型對一組相關值進行分類,描述可以對它們執行的操作并定義它們的存儲方式。 由于類型可能是一個難以理解的概念,因此在了解它們在 Go 中是如何實現之前,我們將從幾個不同的角度來看待它們。
哲學家有時會區分類型和標記。 例如,假設您有一只名叫 Max 的狗。 Max 是標記(特定實例或成員),dog 是類型(一般概念)。“Dog”或“dogness”描述了所有狗共有的一組屬性。 盡管過于簡單,我們可能會這樣推理:所有的狗都有 4 條腿,Max 是一只狗,因此 Max 有 4 條腿。 編程語言中的類型以類似的方式工作:所有字符串都有長度,x 是字符串,因此 x 有長度。
在數學中,我們經常談論集合。 例如:?(所有實數的集合)或?(所有自然數的集合)。 這些集合的每個成員都與該集合的所有其他成員共享屬性。 例如,所有自然數都是結合的:“對于所有自然數 a、b 和 c,a + (b + c) = (a + b) + c 和 a ×(b × c) = (a × b) ×c。” 通過這種方式,集合類似于編程語言中的類型,因為特定類型的所有值共享某些屬性。
Go 是一種靜態類型的編程語言。 這意味著變量始終具有特定類型并且該類型不能更改。 靜態類型起初可能看起來很麻煩。 您將花費大量時間來嘗試修復您的程序,以便它最終能夠編譯。 但是類型可以幫助我們推理我們的程序正在做什么并捕獲各種各樣的常見錯誤。
Go 內置集中數據類型,讓我們來認識一下吧!
數字類型
Go 有幾種不同的類型來表示數字。 通常我們將數字分為兩種不同的類型:整數和浮點數。
整型
整數——就像它們的數學對應物——是沒有小數部分的數字。 (…, -3, -2, -1,0, 1, …) 與我們用來表示數字的基數為 10 的十進制系統不同,計算機使用基數為 2 的二進制系統。
我們的系統由 10 個不同的數字組成。 一旦我們用盡了可用的數字,我們就通過使用 2 個(然后是 3、4、5 ……)個彼此相鄰的數字來表示更大的數字。 例如9后的數字是10,99后的數字是100等等。 計算機也這樣做,但它們只有 2 位數字而不是 10。所以計數看起來像這樣:0、1、10、11、100、101、110、111 等等。 我們使用的數字系統與一臺計算機使用的數字系統之間的另一個區別是所有整數類型都有一個確定的大小。 他們只有一定數量的數字的空間。 所以一個 4 位整數可能看起來像這樣:0000, 0001, 0010, 0011, 0100。最終我們用完了空間,大多數計算機只是回到開頭。 (這會導致一些非常奇怪的行為)
Go 的整數類型有:uint8、uint16、uint32、uint64、int8、int16、int32 和 int64。
8、16、32 和 64 告訴我們每種類型使用多少位。
uint 表示“無符號整數”,而 int 表示“有符號整數”。
無符號整數只包含正數(或零)。
另外還有兩種別名類型:與uint8相同的byte和與int32相同的rune。
字節是計算機上使用的極其常見的度量單位(1 字節 = 8 位,1024 字節 = 1 KB,1024 KB = 1 兆字節,……)因此 Go 的字節數據類型經常用于其他類型的定義。 還有 3 種依賴于機器的整數類型:uint、int 和 uintptr。 它們依賴于機器,因為它們的大小取決于您使用的架構類型。
通常,如果您使用整數,您應該只使用 int 類型。
浮點型
浮點數是包含小數部分(實數)的數字。 (1.234, 123.4, 0.00001234, 12340000) 它們在計算機上的實際表示相當復雜,并不是真正需要知道如何使用它們。 所以現在我們只需要記住以下幾點:
浮點數是不精確的。 有時無法表示一個數字。 例如,計算 1.01 - 0.99 會得到 0.020000000000000018——一個非常接近我們預期的數字,但并不完全相同。
像整數一樣,浮點數也有一定的大小(32 位或 64 位)。 使用更大的浮點數會增加它的精度。 (它可以代表多少位數)
除了數字之外,還有其他幾個可以表示的值:“非數字”(NaN,對于 0/0 之類的東西)以及正無窮大和負無窮大。 (+∞ 和 ?∞)
Go 有兩種浮點類型:float32 和 float64(通常也分別稱為單精度和雙精度)以及兩種用于表示復數(帶虛部的數字)的附加類型:complex64 和 complex128。 通常我們在處理浮點數時應該堅持使用 float64。
例子
package main import ( "fmt" ) func main() { a := 3 b := 4 fmt.Println("1 + 1 =", 1+1) fmt.Println("a + b =", a+b) fmt.Println("1.0 + 1.0 =", 1.0+1.0) }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
輸出結果為:
1 + 1 = 2 a + b = 7 1.0 + 1.0 = 2
1
2
3
和第一個Hello World程序一樣,它包含相同的package main行、相同的 import 行、相同的函數聲明并使用相同的 Println 函數。 這次不是打印字符串 Hello World,而是打印字符串 1 + 1 = 后跟表達式 1 + 1 的結果。該表達式由三部分組成:數字文字 1(類型為 int)、 + 運算符(表示加法)和另一個數字文字 1。讓我們使用浮點數嘗試相同的操作:
請注意,我們使用 .0 來告訴 Go 這是一個浮點數而不是整數。 運行這個程序會給你和以前一樣的結果。
除了 + 法 之外還有其他幾個操作符:
加 +
減 -
乘 *
除 /
取余 %
字符串類型
正如我們在前文中看到的,字符串是用于表示文本的具有確定長度的字符序列。 Go 字符串由單個字節組成,通常每個字符一個。 (中文等其他語言的字符用一個以上的字節表示)
可以使用雙引號"Hello World"創建字符串文字。 它們之間的區別在于雙引號字符串不能包含換行符,并且它們允許特殊的轉義序列。 例如,\n 被換行符替換,\t 被替換為制表符。
對字符串的幾種常見操作包括查找字符串的長度:len("Hello World"),訪問字符串中的單個字符:"Hello World"[1],以及將兩個字符串連接在一起:"Hello " + "World" . 讓我們修改我們之前創建的程序來測試這些:
package main import "fmt" func main() { fmt.Println(len("Hello World")) fmt.Println("Hello World"[1]) fmt.Println("Hello" + "World") }
1
2
3
4
5
6
7
8
9
10
輸出結果為:
11 101 HelloWorld
1
2
3
解釋:
空格也被認為是一個字符,所以字符串的長度是 11 而不是 10,并且第三行有“Hello”而不是“Hello”。
字符串從 0 開始“索引”而不是 1。 [1] 給你第二個元素而不是第一個。 另請注意,當您運行此程序時,您看到的是 101 而不是 e。 這是因為字符由一個字節表示(記住一個字節是一個整數)。考慮索引的一種方法是將其顯示為:“Hello World”1。 您可以將其讀作“字符串 Hello World sub 1”、“字符串 Hello World at 1”或“字符串 Hello World 的第二個字符”。
連接使用與加法相同的符號。Go 編譯器根據參數的類型計算出要做什么。 由于 + 的兩側都是字符串,因此編譯器假定您的意思是連接而不是加法。 (加法對字符串沒有意義)
布爾型
布爾值(以 George Boole 命名)是一種特殊的 1 位整數類型,用于表示真假(或開和關)。 三個邏輯運算符與布爾值一起使用:
&& - and
|| - or
! - not
常見的真值表如下:
代碼如下:
package main import "fmt" func main() { fmt.Println(true && true) fmt.Println(true && false) fmt.Println(true || true) fmt.Println(true || false) fmt.Println(!true) }
1
2
3
4
5
6
7
8
9
10
11
12
13
true false true true false
1
2
3
4
5
Go 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。