,ok或者 ok,_ 兩種寫法是根據函數的返回值決定的,有的第一個返回的是bool,另一個是error信息,就選用ok,_進行判斷,有的第一個參數是一個值或者nil,第二個參數是true/false,就選用_,ok。在一個需要賦值的if條件語句中,使用這種模式去檢測第二個參數值會讓代碼顯得優雅簡潔。這種模式在go語言編碼規范中非常重要。下面總結了所有使用這種模式的例子:
1. 在函數返回時檢測錯誤
value, err := pack1.Func1(param1)
if err != nil {
fmt.Printf(“Error %s in pack1.Func1 with parameter %v”, err.Error(), param1)
return err
}
// 函數Func1沒有錯誤:
Process(value)
e.g.: os.Open(file) strconv.Atoi(str)
上面這段代碼中的函數將錯誤返回給它的調用者,當函數執行成功時,返回的錯誤是nil,使用如下這種寫法更簡潔:
func SomeFunc() error {
…
if value, err := pack1.Func1(param1); err != nil {
…
return err
}
…
return nil
}
這種模式也常用於通過defer使程序從panic中恢復執行。
2. 檢測映射中是否存在一個鍵值:key1在映射map1中是否有值?
if value, isPresent = map1[key1]; isPresent {
Process(value)
}
3. 檢測一個接口類型變量var是否包含了類型T:類型斷言
if value, ok := var.(T); ok {
Process(value)
}
// 接口類型varI沒有包含類型T
4. 檢測一個通道ch是否關閉
for {
if input, open := <-ch; !open {
break // 通道是關閉的
}
Process(input)
}
5、檢測Policy是否存在
//從DB加載策略 e.LoadPolicy() //獲取router路由對象 r := gin.New() r.POST("/api/v1/add", func(c *gin.Context) { fmt.Println("增加Policy") if ok, _ := e.AddPolicy("admin", "/api/v1/hello", "GET"); !ok { fmt.Println("Policy已經存在") } else { fmt.Println("增加成功") } })

