前言
- 動態語言型別
- 自動開闢資料空間,自動識別資料型別 python
- 靜態語言型別
- 開闢記憶體空間,定義資料型別 c,java,go
go 語言中的資料型別
/*
- go 基本資料型別:
- 布林型別
- 數值型別
- 整型 :
- 有符號:int,int8,int16,int32,int64.
- 無符號:uint,uint8,uint16,uint32,uint64
- 浮點型
- float32,float64
- 複數:complex
- 字串型別
- 派生資料型別
- 指標 *
- 陣列 array
- 結構體 struct
- 通道 channel
- 切片 slice
- 函式 func
- 介面 interface
- Map
*/
code
// 1. 布林型別
var b1 bool
var b2 bool
b1 = true
b2 = false
fmt.Println(b1, b2)
// f fmt.Printf 格式化輸出 : %d 整數, %s 字串,%p 記憶體地址, %T 資料型別,%t布林型別資料結果 ,%f 浮點資料
fmt.Printf("布林型別資料的整數結果:b1=%T,%t\n", b1, b1)
fmt.Printf("布林型別資料的整數結果:b2=%T,%t\n", b2, b2)
// 布林預設值 : false = 0 , true = 1
var b3 bool
fmt.Println(b3)
// 2. 整數型別,不能超過該資料型別的長度
var i1 int8
i1 = 10
fmt.Println(i1)
//i1 = 1000 // 超出 int8 的範圍。 cannot use 1000 (untyped int constant) as int8 value in assignment (overflows)
fmt.Println(i1)
//var i2 uint8
//i2 = -100 // cannot use -100 (untyped int constant) as uint8 value in assignment (overflows)
//fmt.Println(i2)
// 3. 浮點型,預設保留 小數點後 六位
var f1 float32
f1 = -19999
fmt.Printf("%T,%f\n", f1, f1)
fmt.Println(f1)
f1 = 3.14
fmt.Printf("%T,%f\n", f1, f1)
fmt.Println(f1)
// 保留小數點後3位. 格式化輸出:%.3f,超出的位數四捨五入
var f2 float32
f2 = 3.1415926
fmt.Printf("%.3f\n", f2) // 3.142。自動四捨五入
// float32 和 float64 精度不一樣. 預設使用 float64
var f3 float32 = -123.0000901
var f4 float64 = -123.0000901
fmt.Println(f3, f4) // -123.00009 -123.0000901
// 4. 特殊數字型別 無符號
// byte型別. byte == uint8
var byte1 byte = 255
fmt.Println(byte1)
fmt.Printf("%T\n", byte1) // uint8 型別
// rune型別 rune == int32
var rune1 rune = 1000000000
fmt.Println(rune1)
fmt.Printf("%T\n", rune1) // int32 型別
// int 預設根據系統位數來定義
var int1 int = 1000
fmt.Println(int1)
fmt.Printf("%T\n", int1) // int 型別
// 5. 字串型別. go中字串由字元組成。 go 預設使用utf-8編碼型別
var str0 string
str0 = "Hello Word"
fmt.Printf("%T %s \n", str0, str0) // string 型別
var str1 string
str1 = "go 語言學習中" // 空格隔開中文,英文不隔開
fmt.Println(str1)
// 單引號:字元 字元的本質是整形數值型別資料. 雙引號:string型別
s1 := 'A'
s2 := "A"
fmt.Println(s1, s2) // 65, A
fmt.Printf("%T,%T\n", s1, s2) // int32,string
// 跳脫字元: \ 轉義符號: \n 換行, \b 刪除上一個字元,\t tab
fmt.Println("hello\nword")
fmt.Println("hello\bword")
fmt.Println("hello\tword")
// 反 跳脫字元
fmt.Println("\\n")
fmt.Println("\"")
// 多行文字 使用 反引號 : ``
s3 := `go 多行文字`
fmt.Println(s3)
// 6. 數值型別轉換. 格式:新型別的值=新型別(舊型別的值).
// int 轉換為 float
var v1 int
v1 = 1
v2 := float64(v1)
fmt.Printf("%T,%d\n", v1, v1)
fmt.Printf("%T,%.3f\n", v2, v2)
// float 轉換為 int
c := 12
d := float64(c)
fmt.Printf("%T,%.3f\n", d, d)
fmt.Printf("%T,%d\n", c, c)
// 布林型別 不支援轉換
數值型
序號 |
型別和描述 |
1 |
uint8 無符號 8 位整型 (0 到 255) |
2 |
uint16 無符號 16 位整型 (0 到 65535) |
3 |
uint32 無符號 32 位整型 (0 到 4294967295) |
4 |
uint64 無符號 64 位整型 (0 到 18446744073709551615) |
5 |
int8 有符號 8 位整型 (-128 到 127) 0 |
6 |
int16 有符號 16 位整型 (-32768 到 32767) |
7 |
int32 有符號 32 位整型 (-2147483648 到 2147483647) |
8 |
int64 有符號 64 位整型 (-9223372036854775808 到 9223372036854775807) |
跳脫字元
運算子
/*
運算子
- 算數運算子
- 取模 %
- 加減乘除
- ++ , -- 自增/自減
- 賦值運算子
- = 賦值運算子
- += 加等於
- -= 減等於
- /= 處等於
- *= 乘等於
- 邏輯運算子
- 與 &&, 或 || ,非 !
- ! 取反運算子
- 位運算子。 加密解密常用。 基於二進位制資料計算
- & 對比位置。相同位置位比較,兩個為1就是1
- | 對比位置。相同位置比較,一個為1就是1
- >> 右移。
- << 左移
- ^ 相異或
- &^ 位清空。 a &^ b。 為:0,取a上的數值。 為:1 ,取0(二進位制)
- 關係運算子
- 大於>,小於<,等於==,不等於!=,大於等於>=,小於等於<= .
- 其他運算子
- & 取地址
- * 指標符號
*/
code
// 取模
c := 7 % 2
fmt.Println(c)
// 取反
b := true
fmt.Println(!b)
// 位運算
// &
aa := 1 //二進位制001
bb := 5 //二進位制101
fmt.Println(aa & bb) // 1
// |
fmt.Println(aa | bb) // 5
// >> 右
fmt.Println(bb >> 1) // 2. 101 右移動1位。 10 = 2
fmt.Printf("%b\n", bb>>1)
// << 左
fmt.Println(bb << 1) // 10. 101 左移動1為。 1010 = 10
fmt.Printf("%b\n", bb<<1)
println()
AA := 60 // 二進位制:0011 1100
BB := 13 // 二進位制:0000 1101
// & 0000 1100
fmt.Println(AA & BB) // 12
res1, _ := strconv.ParseInt("00001101", 2, 64)
fmt.Println("二進位制轉十進位制:", res1)
// | 0011 1101
fmt.Println(AA | BB) // 61
res2, _ := strconv.ParseInt("00111101", 2, 64)
fmt.Println("二進位制轉十進位制:", res2)
// ^ 按位異或. 位置相同為0,不同為1。 0011 0001
fmt.Println(AA ^ BB) // 0011 0001
res3, _ := strconv.ParseInt("00110001", 2, 64)
fmt.Println("二進位制轉十進位制:", res3)
// &^ 位清空。 a &^ b。 為:0,取a上的數值; 為:1 ,取0(二進位制)
fmt.Println(AA &^ BB) // 0011 0000
res4, _ := strconv.ParseInt("00110000", 2, 64)
fmt.Println("二進位制轉十進位制:", res4)
// >> 左移 幾位
fmt.Println(AA << 2) // 二進位制:0011 1100 ----> 1111 0000
res5, _ := strconv.ParseInt("11110000", 2, 64)
fmt.Println("二進位制轉十進位制:", res5)
// << 右移 幾位
fmt.Println(AA >> 2) // 二進位制:0011 1100 ----> 0000 1111
res6, _ := strconv.ParseInt("00001111", 2, 64)
fmt.Println("二進位制轉十進位制:", res6)
位運算子 圖解
運算子 |
描述 |
例項 |
& |
按位與運算子"&"是雙目運算子。都是1結果為1,否則是0 |
(A & B) 結果為 12, 二進位制為 0000 1100 |
| |
按位或運算子"|"是雙目運算子。 都是0結果為0,否是是1 |
(A | B) 結果為 61, 二進位制為 0011 1101 |
^ |
按位異或運算子"^"是雙目運算子。 不同則為1,相同為0 |
(A ^ B) 結果為 49, 二進位制為 0011 0001 |
&^ |
位清空,a &^ b,對於b上的每個數值,如果為0,則取a對應位上的數值,如果為1,則取0. |
(A &^ B) 結果為 48, 二進位制為 0011 0000 |
<< |
左移運算子"<<"是雙目運算子。左移n位就是乘以2的n次方。 其功能把"<<"左邊的運算數的各二進位全部左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0。 |
A << 2 結果為 240 ,二進位制為 1111 0000 |
>> |
右移運算子">>"是雙目運算子。右移n位就是除以2的n次方。 其功能是把">>"左邊的運算數的各二進位全部右移若干位,">>"右邊的數指定移動的位數。 |
A >> 2 結果為 15 ,二進位制為 0000 1111 |
go 中的資料型別圖
賦值運算子
運算子 |
描述 |
例項 |
= |
簡單的賦值運算子,將一個表示式的值賦給一個左值 |
C = A + B 將 A + B 表示式結果賦值給 C |
+= |
相加後再賦值 |
C += A 等於 C = C + A |
-= |
相減後再賦值 |
C -= A 等於 C = C - A |
*= |
相乘後再賦值 |
C *= A 等於 C = C * A |
/= |
相除後再賦值 |
C /= A 等於 C = C / A |
%= |
求餘後再賦值 |
C %= A 等於 C = C % A |
<<= |
左移後賦值 |
C <<= 2 等於 C = C << 2 |
>>= |
右移後賦值 |
C >>= 2 等於 C = C >> 2 |
&= |
按位與後賦值 |
C &= 2 等於 C = C & 2 |
^= |
按位異或後賦值 |
C ^= 2 等於 C = C ^ 2 |
|= |
按位或後賦值 |
C |= 2 等於 C = C | 2 |
其他運算子
運算子 |
描述 |
例項 |
& |
返回變數儲存地址 |
&a; 將給出變數的實際地址。 |
* |
指標變數。 |
*a; 是一個指標變數 |