Go基礎知識梳理(二)
簡單函式的定義
//有引數有回傳值
func sum(a int, b int) int {
return a + b
}
//無回傳值
func sum(a int, b int) {}
//無引數無回傳值
func sum(){}
//回傳多個值
func sum(a int, b int) (int, error) {
return a+b, nil
}
//引數簡寫(型別相同)
func sum(a, b int) int {
return a + b
}
匿名函式的定義
func main() {
//定義一個匿名函式sum
sum := func(a, b int) int {
return a + b
}
res := sum(1 + 2)
fmt.Println(res) // 3
}
defer關鍵字
//defer 陳述句會在return后執行,并且是堆疊原理,先注冊就先入堆疊,最后執行
func main() {
print := func(a string) {
fmt.Println(a)
}
defer print("First")
defer print("Second")
return
}
列印結果
Second
First
func main() {
a := 0
print := func(a int) {
fmt.Println(a)
}
defer print(a)
a += 1
}
列印結果
0 //因為defer陳述句先注冊,已經獲取到了該變數的副本
//另一種情況
func main() {
a := 0
print := func(a *int) {
fmt.Println(*a)
}
defer print(&a)
a += 1
return
}
列印結果
1 //因為獲取到的是a變數的記憶體地址
Error錯誤
//在多個回傳值的函式中,error通常放在最后一位進行回傳
func sum(a, b int) (int, error) {
return a + b, errors.New("fail")
}
//對于處理有err回傳的,應先用if處理
func main() {
a := "1"
b, err := strconv.Atoi(a)
if err != nil {
return
}
fmt.Println(b)
}
//defer 吾句應該放到四判斷的后面,不然有可能產生 panic
//正確寫法
func sql() {
SQL := "SELECT * FROM test"
stmt, err := self.Conn.Prepare(SQL)
if err != nil {
logger.Logln(logger.ERROR, err)
return false
}
defer stmt.Close()
}
//錯誤寫法
func sql() {
SQL := "SELECT * FROM test"
stmt, err := self.Conn.Prepare(SQL)
defer stmt.Close() //updated
if err != nil {
logger.Logln(logger.ERROR, err)
return false
}
//defer stmt.Close()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/421316.html
標籤:其他
上一篇:在Azure云上編排按需作業
