go語言中的case不僅可以基於常量進行判斷,也可以基於表示式進行判斷,不用寫break
一分支多值: case 「1」,」2」
分支表示式:case 4>r &&r>2 // 這種條件下switch後不再跟判斷變數(無判斷目標)
fallthrough關鍵字,執行完乙個case後會執行下乙個case,不建議使用。
可以退出多層迴圈 在迴圈中goto ***,迴圈外***: **
統一錯誤處理,在處理處均goto ***,在進行處理處 ***: **
跳出指定迴圈
outloop:
迴圈1迴圈2
go語言函式本身可以作為值傳遞
支援匿名函式和閉包
函式可以滿足介面
同一型別返回值
func ***() (int,int)
帶有變數名的返回值
func ***() (a,b int)
同一種型別返回值和命名返回值兩種形式只能二選一,混用會發生編譯錯誤
go語言中函式也是一種型別func(),可以和其他型別一樣被儲存在變數中。例如:
func fire()
var f func()
f=fire
f()func(引數列表) (返回引數列表)
func(引數列表) (返回引數列表) (實參列表)
f := func(引數列表) (返回引數列表)
f(實參列表)//通過變數呼叫
func visit(list int, f func(int))
}func main() , func(v int) )
}func main() ,
"run": func() ,
"fly": func() ,
}// *skillparam獲取命令列傳來的值,並在map中查詢對應命令列引數指定的字串的函式
if f, ok := skill[*skillparam]; ok else
}/* 函式實現介面 */
// 函式定義為型別
type funccaller func(inte***ce{}) //將func(inte***ce{})定義為funccaller型別
// 實現invoker的call
func (f funccaller) call(p inte***ce{})
// funccaller無需被例項化,只需要將函式轉化為funccall即可
var in2 invoker //宣告介面變數
// 將匿名函式轉為funccall型別,再賦值給介面
in2 = funccaller(func(v inte***ce{}) )
// 使用介面呼叫 funccaller.call,內部會呼叫函式本體
in2.call("hellp")
類似c++中的lambda表示式,函式是編譯時靜態的概念,閉包是執行時動態的概念
c++與c#為閉包建立了乙個類,**獲的變數在編譯時放到類的成員中,閉包在訪問**獲的變數時,實際上訪問的是閉包隱藏類的成員。
v…t一般放在函式列表的末尾
v …t,表示型別是t,即擁有多個 t元素的t型別切片
t為可變引數的型別,當t為inte***ce{}時,傳入的可以是任意型別(比如fmt.println()的實現)
獲取可變引數的型別s.(type)
go流程控制與函式
package main import fmt func main else 多條件判斷 a 15 if a 0 a 10 else if a 10 a 20 else if a 20 goto跳轉當前函式內定義的標籤 b 10 test if b 0 for迴圈 sum 0 for i 0 i 1...
go流程控制
用於測試條件是否成立,成立則執行if括起來的 if condition 複製 如果需要在條件不滿足時執行,則只需要加上else即可 if condition else 複製 如果存在多個條件,可以使用else if增加新的判斷 if condition1 else if condition2 els...
go流程控制
1 if語句 1 if ture else 2if a 44 a 23else 2 switchswitch 語句用於基於不同條件執行不同動作,每乙個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。golang switch 分支表示式可以是任意型別,不限於常量。可省略 break,預設...