,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("增加成功") } })