#內置基礎數據類型
在自然界里面,有貓,有狗,有豬。有各種動物。每種動物都是不同的。
比如貓會喵喵叫,狗會旺旺叫,豬會哼哼叫。。。
Stop!!!
好了,大家畢竟不是幼兒園的小朋友。介紹到這里就可以了。
論點就是每個東西都有自己歸屬的類別(Type)。
那么在Go語言里面,每個變量也都是有類別的,這種類別叫做`數據類型(Data Type)`。
Go的數據類型有兩種:一種是`語言內置的數據類型`,另外一種是`通過語言提供的自定義數據類型方法自己定義的自定義數據類型`。
先看看語言`內置的基礎數據類型`
**數值型(Number)**
數值型有`三種`,一種是`整數類型`,另外一種是`帶小數的類型`(一般計算機里面叫做`浮點數類型`),還有一種`虛數類型`。
整數類型不用說了,和數學里面的是一樣的。和數學里面不同的地方在于計算機里面`正整數和零`統稱為`無符號整型`,而`負整數`則稱為`有符號整型`。
Go的內置整型有`uint8`, `uint16`, `uint32`, `uint64`, `int8`, `int16`, `int32`和`int64`。其中`u`開頭的類型就是`無符號整型`。無符號類型能夠表示正整數和零。而有符號類型除了能夠表示正整數和零外,還可以表示負整數。
另外還有一些別名類型,比如`byte`類型,這個類型和`uint8`是一樣的,表示`字節類型`。另外一個是`rune類型`,這個類型和`int32`是一樣的,用來表示`unicode的代碼點`,就是unicode字符所對應的整數。
Go還定義了三個`依賴系統`的類型,`uint`,`int`和`uintptr`。因為在32位系統和64位系統上用來表示這些類型的位數是不一樣的。
*對于32位系統*
uint=uint32
int=int32
uintptr為32位的指針
*對于64位系統*
uint=uint64
int=int64
uintptr為64位的指針
至于類型后面跟的數字8,16,32或是64則表示用來表示這個類型的位不同,`位越多,能表示的整數范圍越大`。
比如對于用N位來表示的整數,如果是`有符號的整數`,能夠表示的整數范圍為`-2^(N-1) ~ 2^(N-1)-1`;如果是`無符號的整數`,則能表示的整數范圍為`0 ~ 2^N`。
Go的浮點數類型有兩種,`float32`和`float64`。float32又叫`單精度浮點型`,float64又叫做`雙精度浮點型`。其`最主要的區別就是小數點后面能跟的小數位數不同`。
另外Go還有兩個其他語言所沒有的類型,`虛數類型`。`complex64`和`complex128`。
對于數值類型,其所共有的操作為`加法(+)`,`減法(-)`,`乘法(*)`和`除法(/)`。另外對于`整數類型`,還定義了`求余運算(%)`
求余運算為整型所獨有。如果對浮點數使用求余,比如這樣
package main
import (
"fmt"
)
func main() {
var a float64 = 12
var b float64 = 3
fmt.Println(a % b)
}
編譯時候會報錯
invalid operation: a % b (operator % not defined on float64)
所以,這里我們可以知道所謂的`數據類型有兩層意思`,一個是定義了`該類型所能表示的數`,另一個是定義了`該類型所能進行的操作`。
簡單地說,對于一只小狗,你能想到的一定是狗的面貌和它會汪汪叫,而不是貓的面容和喵喵叫。
**字符串類型(String)**
字符串就是一串固定長度的字符連接起來的字符序列。Go的字符串是由`單個字節`連接起來的。(對于漢字,通常由多個字節組成)。這就是說,傳統的字符串是由字符組成的,而`Go的字符串不同`,是`由字節組成`的。這一點需要注意。
字符串的表示很簡單。用(雙引號"")或者(``號)來描述。
"hello world"
或者
`hello world`
唯一的區別是,**雙引號之間的轉義字符會被轉義,而``號之間的轉義字符保持原樣不變**。
package main
import (
"fmt"
)
func main() {
var a = "hello \n world"
var b = `hello \n world`
fmt.Println(a)
fmt.Println("----------")
fmt.Println(b)
}
輸出結果為
hello
world
----------
hello \n world
字符串所能進行的一些基本操作包括:
(1)`獲取字符長度`
(2)`獲取字符串中單個字節`
(3)`字符串連接`
package main
import (
"fmt"
)
func main() {
var a string = "hello"
var b string = "world"
fmt.Println(len(a))
fmt.Println(a[1])
fmt.Println(a + b)
}
輸出如下
5
101
helloworld
這里我們看到a[1]得到的是一個整數,這就證明了上面`"Go的字符串是由字節組成的這句話"`。我們還可以再驗證一下。
package main
import (
"fmt"
)
func main() {
var a string = "你"
var b string = "好"
fmt.Println(len(a))
fmt.Println(len(b))
fmt.Println(len(a + b))
fmt.Println(a[0])
fmt.Println(a[1])
fmt.Println(a[2])
}
輸出
3
3
6
228
189
160
我們開始的時候,從上面的三行輸出知道,"你"和"好"分別是用三個字節組成的。我們依次獲取a的三個字節,輸出,得到結果。
**布爾型(Bool)**
布爾型是表示`真值`和`假值`的類型。可選值為`true`和`false`。
所能進行的操作如下:
`&& and 與`
`|| or 或`
`! not 非`
Go的布爾型取值`就是true`或`false`。`任何空值(nil)或者零值(0, 0.0, "")都不能作為布爾型來直接判斷`。
package main
import (
"fmt"
)
func main() {
var equal bool
var a int = 10
var b int = 20
equal = (a == b)
fmt.Println(equal)
}
輸出結果
false
下面是錯誤的用法
package main
import (
"fmt"
)
func main() {
if 0 {
fmt.Println("hello world")
}
if nil {
fmt.Println("hello world")
}
if "" {
fmt.Println("hello world")
}
}
編譯錯誤
./t.go:8: non-bool 0 (type untyped number) used as if condition
./t.go:11: non-bool nil used as if condition
./t.go:14: non-bool "" (type untyped string) used as if condition
上面介紹的是Go語言內置的基礎數據類型。