传递从地图返回得到

时间:2018-04-19 12:45:59

标签: dictionary go

我已经为go go的Web Crawler练习编写了以下类型和Get函数。

else

一切正常,但我想知道是否有办法改进Get功能,我尝试了以下内容:

type UrlCache struct {
    urls map[string]string
    mux  sync.Mutex
}

func (c *UrlCache) Get(key string) (value string, ok bool) {
    c.mux.Lock()
    defer c.mux.Unlock()
    value, ok = c.urls[key]
    return
}

但是抛出

func (c *UrlCache) Get(key string) (string, bool) {
    c.mux.Lock()
    defer c.mux.Unlock()
    return c.urls[key]
}

有没有办法将地图上get的两个返回值作为return返回?

2 个答案:

答案 0 :(得分:1)

单个return语句无法实现。

原因在于Spec: Index expressions:

  

在特殊表单的 assignment或初始化中使用的map[K]V类型的地图上的索引表达式

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
     

产生一个额外的无类型布尔值。如果地图中存在关键字ok,则true的值为x,否则为false

重点是特殊的逗号表单只能用于赋值或初始化。您尝试在return语句中使用它,因此索引表达式只产生一个结果,因此您得到编译时错误。

由于Go中的作业不是表达式而是声明,因此您甚至不能执行以下操作:

return (value, ok = c.urls[key]) // COMPILE-TIME ERROR!

答案 1 :(得分:0)

道歉,误读了一切:

返回地图值时,您将在“单值”上下文中访问地图。您可以使用返回的值或两个值访问地图。除非你发出信号要求你想要两个值,否则你只能得到一个。所以你不能真的(如果你想要返回两件事)避免使用value, ok :=签名获取地图值。该函数的第一个版本命名返回参数,允许最后只有'{1}}语句“正常工作”,第二个版本需要

return