一、 單點知識:
1. &取址,*取值
2. 包訪問:“大小寫控制”
大寫:可導出[要使某個符號對其他包可見,只需將該符號定義爲以大寫字母開頭即可。這規則對於成員變量和成員函數是一致的。]
小寫:私有
3. var + import
pkg.fuc
var name type = value
var (
name1 type1 = value1
name2 type2 = value2
name3 type3 = value3
...
)
import(
"fmt"
"os"
)
4. := “局部”
:= 是聲明變量並賦值
:=只能在函數中使用,所以只能定義局部變量。
:=定義的變量不能改變值(也就是b:="q",在函數中不能再重新這樣定義 b:="s",但是可以b="s")
b, f := "q", 1
= “全局”
= 是賦值,var和=可以平行定義並賦值:
5.字符串兩種表示:
“ ”
' '
6. make 引用 (高效) map sclice channel
new 值
7. Fuc 函數 可以賦值給變量: var identifier = fuc()
IF 接口 y,ok =x.(Type) 轉換成 Type類型的IF;默認爲 pointer類型;
8.case,switch:
1、花括號{必須與for處於同一行。
2、單個case後可以出現多個結果選項
3、只有在case中明確添加fallthrough關鍵字,纔會繼續執行下一個case
-------------------------------------------------------------------------------
二、 非單點知識點:
1、func 函數名(args ...Type) (返回值列表) { // 函數體 }
√ 形如args ...Type的用法只能作爲函數的參數類型,並且必須是最後一個參數。
√ 形如args ...Type的用法是一個語法糖(syntactic sugar),即對語言功能沒有影響,但可以增加程序的可讀性。
√ 形如args ...Type的用法從內部實現上說,其本質上是一個數組切片,即[]type,因此可以用for循環來獲得每個傳入的參數。
2、流程控制語句類型
▪ 選擇語句中,左花括號{必須與switch同處一行。
▪ 選擇語句中,case後可以使用常量,還可以使用變量。
▪ 選擇語句中,單個case後可以出現多個結果選項。
▪ 選擇語句中,不需要用break來明確退出一個case。
▪ 選擇語句中,只有在case中明確添加fallthrough關鍵字,纔會繼續執行下一個case。
▪ 選擇語句中,可不設定switch後的條件表達式,在此種情況下整個switch結構與if...else...的邏輯等同。
循環語句只支持for結構,不支持while和do-while結構。
▪ 循環語句左花括號{必須與for處於同一行。
▪ 循環語句不支持以逗號爲間隔的多賦值語句,支持使用多元賦值的方式來初始化多個變量。
▪ 循環語句支持continue和break來控制循環,但提供了一個更高級的break,可以選擇中斷哪一層循環。
▪ 條件語句不需要使用括號()將條件包含起來。
▪ 條件語句無論語句體內有幾條語句,花括號{}都必須存在。
▪ 條件語句的左花括號{必須與if或else同處一行,否則編譯器給出錯誤:syntax error: missing { after if clause。
▪ 條件語句的else必須和上一個語句體結束的右花括號}同處一行,否則編譯器給出錯誤:syntax error: unexpected else, expecting }。
▪ 條件語句在if之後可以添加變量初始化語句,但需要使用分號;間隔。
if a := 1; a >= 1 { fmt.Println("OK") }
▪ 條件語句:關鍵字爲if、else和else if。
▪ 選擇語句:關鍵字爲switch、case和select。
▪ 循環語句:關鍵字爲for和range。
▪ 跳轉語句:關鍵字爲goto
3、資源釋放
在c++程序中,經常要注意內存指針、文件句柄、網絡套接字等等資源的釋放,特別需要注意其釋放的時機。而golang使用defer
關鍵字和背後的內部機制簡單地解決了資源釋放的問題。
√ defer關鍵字能保證其後的代碼能在函數退出前調用。
√ 一個函數中可以存在多個defer語句,需要注意的是defer語句的調用是遵照先進後出的原則,即最後一個defer語句將最先被執行。
√ 可以在defer後加一個匿名函數來進行復雜的清理工作。
異常處理
一些高級語言中一般提供類似try...catch...finally...的語法,用於捕獲異常。golang提供panic和recover兩個關鍵字用於異常處理。
• panic
panic在golang中是一個內置函數,接收一個interface{}類型的值作爲參數:
func panic(interface{}) { ... }
當一個函數執行過程中調用panic函數時,函數執行流程將立即終止,但panic之前的defer關鍵字延遲執行的語句將正常執行,之後該函數將返回到上層調用函數,並逐層向上執行panic流程,直至函數所屬的goroutine中所有正在執行函數終止。錯誤信息將被報告,包括在調用panic()函數時傳入的參數。
• recover
recover在golang中是一個內置函數,返回一個interface{}類型的值作爲參數:
func recover() interface{} { ... }
panic函數觸發後不會立即返回,而是先defer,再返回。如果defer的時候,有辦法將panic捕獲到,然後及時進行異常處理,並阻止panic傳遞,那處理機制就完善了。因此golang提供了recover內置函數,用於捕獲panic並阻止其向上傳遞。需要注意的是,recover之後,邏輯並不會恢復到panic處,函數還是會在defer之後返回,但是所屬goroutine將不會退出。
4、• 值類型和引用類型
√ 引用類型一個特點:引用不綁定特定對象(c++中引用是要綁定特定對象),例如有兩個同類型引用a和b,它們可以引用各自的對象A和B;但如果a和b的引用都指向A,那麼通過b修改對象內容可以反應到a引用之中。
√ golang從本質上說,一切皆是值類型,並沒有內建一個類似java或c#等語言中的reference類型。
√ golang可以使用指針,可以在行爲上達到類似java或c#等語言中reference的效果。
√ golang中從行爲表現上看,數組屬於值類型,數組切片、字典、通道和接口屬於引用類型。
▶ 引用類型實現
√ golang中通過指針能實現引用類型效果。
√ golang中通過指針或對象訪問成員都是使用點操作符,因此指針看起來和對象一樣,即類似引用
5、與數組切片和字典類似,通道和接口本質上說是值類型,但從行爲表現上看屬於引用類型
6、
golang 類型:
基礎+複合
√ golang內建基礎類型有布爾類型、整數類型、浮點類型、複數類型、字符串類型、字符類型和錯誤類型。
√ golang支持的複合類型有指針、數組、數組切片、字典、通道、結構體和接口。
11. reflect.Value.Kind():返回的常量:
const (
Invalid Kind = iota
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
Array
Chan
Func
Interface
Map
Ptr
Slice
String
Struct
UnsafePointer
)