Go的基本資料型別
Go語言的基礎資料型別
Go語言的資料型別主要分為四種:基礎型別(數字,字串,布林型別),複合型別(陣列,結構體),引用型別(指標,切片,字典,函式和通道),介面型別
整型
Go 語言的整型定義型別有符號型別主要有int8,int16,int32,int64, 無符號型別uint8,uint16,uint32,uint64. int 和uint 是對應硬體平臺分別對應不同的位數。以及uintptr
型別 | 有無符號 | bit數 |
int8 | yes | 8 |
int16 | yes | 16 |
int32 | yes | 32 |
int64 | yes | 64 |
uint8 | no | 8 |
uint16 | no | 16 |
uint32 | no | 32 |
uint64 | no | 64 |
int | yes | 等於cpu位數 |
uint | no | 等於CPU的位數 |
byte | no | 等於uint8 |
rune | yes | 等同於int32 |
uintptr | no | - |
Go語言的Bit操作符主要有以下幾種:
& 位運算 AND
| 位運算 OR
^ 位運算 XOR
&^ 位清空 (AND NOT)
<< 左移
>> 右移
這些操作符大部分和C語言的沒什麼不同,在這裡說一下&^這個運算子是&和^的結合
x &^ y
這裡的意思就是y為1的位都為0,然後其餘的和x一樣。也就是先執行了^y操作然後 &x。
浮點型
- 浮點數表示:
Go語言定義了兩個型別float32和float64,其中float32等價於C語言的float型別,
float64等價於C語言的double型別。
在這裡普及一下float在記憶體中的儲存方式
float
共計32位,摺合4位元組
由最高到最低位分別是第31、30、29、……、0位
31位是符號位,1表示該數為負,0反之。
30-23位,一共8位是指數位。
22-0位,一共23位是尾數位。
float的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是一個隱含著的“1”,由於它是不變的,故不能對精度造成影響。
float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字。
不懂的可以參照
然後GO聖經的這個程式碼:
var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1) // "true"!
為什麼f == f+1,其實就是精度的問題,大家可以測試一下f+3和f+4的結果應該也是一樣的,對於要捨棄的第一位(大於23位的第一位如果是1是要進位到前面去的)。
對於浮點型的比較因為是不精確的,所以不能使用==,可以使用下面的程式碼
import "math"
func Checkqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}
p是使用者自定義的精度,如:0.000001
複數
複數由兩部分組成,實部(real)和虛部(imag).Go 語言提供了complex64和complex128兩種精度。
複數的表示:
var x complex64
x = 4 + 4i
y := 4 + 4i
z := complex(4,4)
在這裡x代表是complex64型別, y,z都屬於complex128型別。
對於複數,可以通過Go語言內建的real(x)和imag(x)來分別獲取複數的實部和虛部。
布林型別
布林型別和和C語言的沒什麼區別關鍵字bool,可以賦值true 和false 。這裡不做其它講述。
字串和Byte切片
字串在任何語言裡面都是一個很好用的東西。Go語言是直接支援原生的字串型別。Go語言的字串的操作感覺很像python裡面的操作,看下面的字串操作程式碼:
func StringFunc(s string) {
fmt.Printf("%c", s[0]) // 下標操作和傳統的C一樣
var f string = ",wenxuwan"
s = s + f //字串連線,可以直接+連結兩個字串
fmt.Println(s[0:4]) //截斷操作,列印0-3下表的字串
fmt.Println(len(s)) //列印字串的長度
}
var str string = "Hello,world"
StringFunc(str)
對於中文字元的,如果想獲取到中文字元,可以先將string轉換為rune陣列,得到中文的Unicode,然後用string將Unicode轉換為字元即可。
常量
- 1
常量的關鍵字和C語言的一樣,都是const表示:
const i = 3.1415926
const同時支援批量宣告
const(
a = 10
b
c =20
d
)
批量宣告除了第一個必須賦值,其它的都可以省略。你如果列印a,b,c,d的值,結果是10,10,20,20。也就保持和上面的值一樣。
- 2
這樣看來其實const批量宣告也沒什麼大的作用,因此我們需要來介紹iota(常量生成器),它和其它語言裡面的enum是一樣的作用
const(
first = iota
second
third
fourth
)
輸出之後,結果應該是0,1,2,3。
在這裡如果程式碼如下
const(
first = iota
second
third = 10
fourth
)
結果會是什麼?
如果是這樣,結果是什麼?
const(
first = iota
second
third = 10
fourth = iota
)
大家可以通過這個來自己感受iota的使用
這裡還有一種使用方法
const(
first = 1 << iota
second
third
fourth
)
結果大家測試一下。