一、基礎知識
思維導版本
流程控制語句
for迴圈
接一個條件表示式
接三個表示式
接一個 range 表示式
可以用於讀取slice和map的資料
使用_來丟棄不需要的返回值
不接表示式
if判斷
條件判斷語句裡面允許宣告一個變數,這個變數的作用域只能在該條件邏輯塊內,其他地方不起作用
switch選擇
變數/常量
宣告變數
單個變數
不賦值:var i int
賦值:var i = 10.11 var i int = 10
匿名變數:短下劃線 _,忽略
多個變數
var n1,n2,n3 int
var n1,n2, n3 = 100,”tom”,888
n1,n2,n3 := 100,”tom”,888
宣告常量
關鍵字const,也可重置
可以不賦值,同上一行的值
iota計數器,列舉
注意
在同一範圍內可變
變數 = 變數名 + 值 + 資料型別
String預設空擋,小數預設為0
運算子
算術運算子
+
-
*
/
%
++/– 是語句,不是運算子
關係運算子
==
!=
>
>=
<
<=
邏輯運算子
&&
||
!
位運算子
&:二進位制加法運算,都是1就是1
|:有一個是1就是1
^:不一樣就是1
<<:左移,×2
>>:右移,/2
賦值運算子
=
+=
*=
/=
%=
<<=
>>=
&=
|=
^=
轉義字元
\t 一個製表符,中間有空格
\n 換行符
\ 在輸出路徑的時候用
" 一個“
\r 一個回車,從頂頭開始輸,覆蓋掉前面的
格式化輸出
布林值
- %t 單詞true或false
整數
%b 二進位制表示
%c 相應Unicode碼點所表示的字元
%d 十進位制表示
%o 八進位制表示
%q 單引號圍繞的字元字面值,由Go語法轉義
%x 十六進位制表示,字母形式為小寫 a-f
%X 十六進位制表示,字母形式為大寫 A-F
%U Unicode格式:123,等同於 “U+007B”
浮點數、複數
%b 無小數部分、二進位制指數的科學計數法,
%e 科學計數法,例如 -1234.456e+78
%E 科學計數法,例如 -1234.456E+78
%f 有小數點而無指數,例如 123.456
%G 根據實際情況採用%E或%F格式(以獲得更簡潔、準確的輸出)
%g 根據情況選擇 %e 或 %f 以產生更緊湊的(無末尾的0)輸出
字串和[]byte
%q 雙引號圍繞的字串,由Go語法轉義
%s 字串或切片的無解譯位元組
%x 十六進位制,小寫字母,每位元組兩個字元
%X 十六進位制,大寫字母,每位元組兩個字元
指標
- %p 表示為十六進位制,並加上前導的0x
通用佔位符
%v 值的預設格式。
%+v 類似%v,但輸出結構體時會新增欄位名
%#v 相應值的Go語法表示
%T 相應值的型別的Go語法表示
%% 百分號,字面上的%,非佔位符含義
二、資料型別
基本資料型別
數值型
整數型
int/int8/int16/int32/int64
uint/uint8/uint16/uint32/uint64/byte
型別 :int,unit,rune(int32),byte(uint8)
浮點型
float 32
float64(預設)
複數
complex128
complex64
字元型
- 佔用空間是用unsafe.sizeof(引數)
布林型(bool)
預設false
不參與運算和轉換
字串(string)
反引號’’字串以原生形式輸出
長度:len(變數名)
分割:strings.Split(變數名,“切割標準”)
包含:strings.Contains(變數名,“包含內容”)
字首:strings.HasPrefixstrings.
字尾:strings.HasSuffix
判斷位置: strings.Index
最後出現的位置:strings.LastIndex
join拼接:strings.Join(變數名, “符號”)
複雜資料型別
指標(Pointer)
宣告一個指標
var p *int
指向一個記憶體地址
p = &a
不分配變數,值為nil
永遠正確:var == *(&var)
適用環境:函式可以直接修改引數的值,而不是對引數的副本進行操作–引用傳遞
陣列
定義
var 陣列名 [數量]型別
初始化
不賦值
- var testArray [3]int
賦值
var testArray [3]int{1,2}
長度:var testArray […]int{1,2}
索引:a := […]int{1: 1, 3: 2}
巢狀陣列
doubleArray := [2][4]int
{
[4]int{1, 2, 3, 4},
[4]int{5, 6, 7, 8}
}
easyArray := [2][4]int
{
{1, 2, 3, 4},
{5, 6, 7, 8}
}
遍歷
for *3
for range
管道(Channel)
切片(slice)
ar[:n]等價於ar[0:n]
ar[n:]等價於ar[n:len(ar)]
ar[:]等價於ar[0:len(ar)]
內建函式
len 獲取slice的長度
cap 獲取slice的最大容量
append 向slice裡面追加一個或者多個元素
copy 函式copy從源slice的src中複製元素到目標dst,並且返回複製的元素的個數
介面(interface)
map
格式: map[keyType]valueType
特點:
map是無序的,必須通過key獲取
引用型別,長度不固定
len函式返回map擁有的key的數量
make(T, args)
map、slice 和channel
返回一個有初始值(非零)的T型別:零值
int 0
int8 0
int32 0
int64 0
uint 0x0
rune 0 //rune的實際型別是 int32
byte 0x0 // byte的實際型別是 uint8
float32 0 //長度為 4 byte
float64 0 //長度為 8 byte
bool false
string “”
new(T)
各種型別的記憶體分配
new返回指標
三、與Java比較
相同
引入包
垃圾回收機制
管道通訊機制
嚴格區分大小寫
同一個包下兩個main函式會報錯
不同
指標
天然併發
返回值可多個
語句後不用帶分號
變數擱到型別前
切片slice/延時執行defer
引了包/變數沒用會登出
一行執行一條語句
四、進階知識
反射
func (t *rtype) String() string
獲取 t 型別的字串描述,不要通過 String 來判斷兩種型別是否一致。
func (t *rtype) Name() string
獲取 t 型別在其包中定義的名稱,未命名型別則返回空字串。
func (t *rtype) PkgPath() string
獲取 t 型別所在包的名稱,未命名型別則返回空字串。
func (t *rtype) Kind() reflect.Kind
獲取 t 型別的類別。
func (t *rtype) Size() uintptr
獲取 t 型別的值在分配記憶體時的大小,功能和 unsafe.SizeOf 一樣。
func (t *rtype) Align() int
獲取 t 型別的值在分配記憶體時的位元組對齊值。
func (t *rtype) FieldAlign() int
獲取 t 型別的值作為結構體欄位時的位元組對齊值。
func (t *rtype) NumMethod() int
獲取 t 型別的方法數量。
func (t *rtype) NumField() int
返回一個struct 型別 的屬性個數,如果非struct型別會拋異常
func (t *rtype) Method() reflect.Method
根據索引獲取 t 型別的方法,如果方法不存在,則 panic。
如果 t 是一個實際的型別,則返回值的 Type 和 Func 欄位會列出接收者。
如果 t 只是一個介面,則返回值的 Type 不列出接收者,Func 為空值。
func (t *rtype) MethodByName(string) (reflect.Method, bool)
根據名稱獲取 t 型別的方法。
func (t *rtype) Implements(u reflect.Type) bool
判斷 t 型別是否實現了 u 介面。
func (t *rtype) ConvertibleTo(u reflect.Type) bool
判斷 t 型別的值可否轉換為 u 型別。
func (t *rtype) AssignableTo(u reflect.Type) bool
判斷 t 型別的值可否賦值給 u 型別。
func (t *rtype) Comparable() bool
判斷 t 型別的值可否進行比較操作
注意對於:陣列、切片、對映、通道、指標、介面
func (t *rtype) Elem() reflect.Type
獲取元素型別、獲取指標所指物件型別,獲取介面的動態型別
使用
通過反射獲取結構體成員型別
通過反射獲取物件值
建立物件和呼叫方法
本作品採用《CC 協議》,轉載必須註明作者和本文連結