Go語言 中逗號ok模式


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

轉自:https://www.cnblogs.com/embedded-linux/p/11129103.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM