GoLang/Mux 语法问题:if ID, Ok = mux.Vars(r)["ID"]; !行

Posted

技术标签:

【中文标题】GoLang/Mux 语法问题:if ID, Ok = mux.Vars(r)["ID"]; !行【英文标题】:GoLang/Mux syntax question: if ID, Ok = mux.Vars(r)["ID"]; !ok 【发布时间】:2019-06-28 02:54:07 【问题描述】:

我对 Golang 很陌生,我正在阅读某人的使用 gorilla/mux 的 API 代码,我遇到了这段代码。

func heroGet(w http.ResponseWriter, r *http.Request) 
    var ID string
    var Ok bool
    if ID, Ok = mux.Vars(r)["ID"]; !Ok
        //do something
    

我无法理解 Ok 在这种特定情况下的作用以及何时触发 !Ok

注意这个函数是GET端点。

(r.HandleFunc("/hero/ID", heroGet).Methods("GET"))

【问题讨论】:

调用 mux.Vars(r) 返回一个映射,["ID"] 尝试使用键 "ID" 从映射中检索一个值。在 Go 中对映射进行索引可以可选地返回两个值,(1) 映射到提供的键的值,(2) 指示值是否实际映射到键的布尔值。 ... 那么当映射不包含 ID 键值时,!Ok 将触发。 【参考方案1】:

我假设您正在使用 goriila mux。我检查了source code,mux.Vars() 返回一个类型为map[string]string 的值。

简而言之,map 数据类型可以选择返回两个值。

    第一个是根据请求键的实际值 第二个是带有请求键的项目是否存在的指示符(布尔值)。

请看下面的例子:

vars := map[string]string
    "one": "1",
    "two": "",


value1, ok1 := vars["one"]
fmt.Println("value:", value1, "is exists:", ok1)
// value: 1 is exists: true

value2, ok2 := vars["two"]
fmt.Println("value:", value2, "is exists:", ok2)
// value:  is exists: true

value3, ok3 := vars["three"]
fmt.Println("value:", value3, "is exists:", ok3)
// value:  is exists: false

从上面的例子我们可以清楚地看到,如果请求的项目不存在,那么第二次返回将是false

如果该项目存在,即使该值为零值,则第二次返回仍将是true,因为该项目确实存在,不一定重要值是什么。

【讨论】:

以上是关于GoLang/Mux 语法问题:if ID, Ok = mux.Vars(r)["ID"]; !行的主要内容,如果未能解决你的问题,请参考以下文章

Shell(if语法的使用)

mssql 这是语法'if' [重复]

Python if语句

python异常处理

某OK最新版漏洞组合拳GETSHELL

捕捉打字稿语法错误:if 语句和类方法调用