我已经为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返回?
答案 0 :(得分:1)
单个return
语句无法实现。
在特殊表单的 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