go語言知識點,重點歸納,沿著這些方向,入門沒有問題

5suitaitou 發表於 2021-11-27
Go

一、基礎知識

思維導版本

流程控制語句

for迴圈

  1. 接一個條件表示式

  2. 接三個表示式

  3. 接一個 range 表示式

    • 可以用於讀取slice和map的資料

    • 使用_來丟棄不需要的返回值

  4. 不接表示式

if判斷

條件判斷語句裡面允許宣告一個變數,這個變數的作用域只能在該條件邏輯塊內,其他地方不起作用

switch選擇

變數/常量

宣告變數

單個變數

  1. 不賦值:var i int

  2. 賦值:var i = 10.11 var i int = 10

  3. 匿名變數:短下劃線 _,忽略

多個變數

  1. var n1,n2,n3 int

  2. var n1,n2, n3 = 100,”tom”,888

  3. 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語法表示

  • %% 百分號,字面上的%,非佔位符含義

二、資料型別

基本資料型別

數值型

整數型
  1. int/int8/int16/int32/int64

  2. uint/uint8/uint16/uint32/uint64/byte

  3. 型別 :int,unit,rune(int32),byte(uint8)

浮點型
  1. float 32

  2. float64(預設)

複數
  1. complex128

  2. complex64

字元型

  • 佔用空間是用unsafe.sizeof(引數)

布林型(bool)

  • 預設false

  • 不參與運算和轉換

字串(string)

  1. 反引號’’字串以原生形式輸出

  2. 長度:len(變數名)

  3. 分割:strings.Split(變數名,“切割標準”)

  4. 包含:strings.Contains(變數名,“包含內容”)

  5. 字首:strings.HasPrefixstrings.

  6. 字尾:strings.HasSuffix

  7. 判斷位置: strings.Index

  8. 最後出現的位置:strings.LastIndex

  9. join拼接:strings.Join(變數名, “符號”)

複雜資料型別

指標(Pointer)

  1. 宣告一個指標

  2. var p *int

  3. 指向一個記憶體地址

  4. p = &a

  5. 不分配變數,值為nil

  6. 永遠正確:var == *(&var)

  7. 適用環境:函式可以直接修改引數的值,而不是對引數的副本進行操作–引用傳遞

陣列

定義

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
特點:
  1. map是無序的,必須通過key獲取

  2. 引用型別,長度不固定

  3. len函式返回map擁有的key的數量

make(T, args)
  1. map、slice 和channel

  2. 返回一個有初始值(非零)的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比較

相同

  1. 引入包

  2. 垃圾回收機制

  3. 管道通訊機制

  4. 嚴格區分大小寫

  5. 同一個包下兩個main函式會報錯

不同

  1. 指標

  2. 天然併發

  3. 返回值可多個

  4. 語句後不用帶分號

  5. 變數擱到型別前

  6. 切片slice/延時執行defer

  7. 引了包/變數沒用會登出

  8. 一行執行一條語句

四、進階知識

反射

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 協議》,轉載必須註明作者和本文連結